
什么是Nuget
NuGet是一个.NET平台下的开源项目,是.NET平台的包管理工具。它可以创建、上传和引用package,并且可以通过NuGet Gallery或自己搭建程序集源去使用Nuget package。

Nuget包的扩展名为.nupkg的单个ZIP文件,其中包含编译代码(dll)、与该代码相关的其他文件以及描述性清单(包含包版本号等信息)。
- 代码相关的其他文件:NuGet包还可能包含其他与代码相关的文件。这可能包括文档、图像、配置文件、语言文件(用于本地化)或者其他任何与该程序集一起使用或需要的文件。这些额外的文件确保了包的完整性和一致性,并为用户提供了更多关于如何使用该包的信息。
- 描述性清单(包含包版本号等信息):在NuGet包中,有一个特殊的清单文件(通常是XML格式),用于描述包的基本信息和元数据。这个清单文件包含了包的名称、版本号、描述、作者、版权信息等,这些信息对于用户了解和使用包非常重要。此外,清单还可以包含指向包中其他文件的引用,例如程序集的名称和版本,以及指向任何文档或额外文件的链接。
Nuget客户端工具
包括但不限于:
- dotnet SDK:适用于 .NET Core 和 .NET Standard 库的 CLI 工具,以及任何 SDK 样式项目(例如面向 .NET Framework 的项目 )。 此 CLI 工具包含在 .NET Core SDK 中,并在所有平台上提供核心 NuGet 功能。 在 Visual Studio 2017 及更高版本中,dotnet CLI 会自动随任何 .NET Core 相关工作负载一起安装。
- nuget.exe:适用于 .NET Framework 库和任何 非 SDK 样式项目的 CLI 工具,例如面向 .NET Standard 库的项目。 在 Mono 下运行时,此 CLI 工具在 Windows 上提供所有 NuGet 功能,以及 Mac 和 Linux 上的大多数功能。
- IDE中的包管理器:程序包管理器 UI 和 程序包管理器 控制台(Windows 上的 PowerShell)。
如何管理Nuget包
使用IDE管理Nuget包
- 查找安装

注意要安装的包的名称、版本以及package source。 - 更新包

- 管理解决方案的包

至此,我们可以将Nuget包引入到项目中,包被下载到了一个nuget公共目录,例如Windows10系统上是 C:\Users\Username.nuget\packages,这样nuget包就不会被重复下载。而在项目中nuget仅仅将依赖信息写入了csproj项目文件与obj文件夹中的project.assets.json,其中csproj项目文件中的内容如下。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
</ItemGroup>
</Project>
实际Nuget包的引用场景:
在此项目中,有三个不同的地方引用了B,而这三个引用可能对B包的版本有不同的要求。Nuget会自动管理所有包的依赖关系。对于被多次引用的包,Nuget会找到一个版本,以满足所有使用者的需求(但在某些情况下,由于版本冲突,可能无法找到合适的包)。
使用dotnet CLI管理
- 安装特定版本的包
dotnet add package <PACKAGE_NAME> -v <VERSION>
- 删除包
dotnet remove package <PACKAGE_NAME>
使用NuGet CLI 管理 NuGet 包
- 安装包
使用 -OutputDirectory 选项将包安装到特定目录。 如果未指定输出目录,install 会使用当前目录。
nuget install <packageID | configFilePath> -OutputDirectory <outputDirectory>
可以指定当前或另一个目录中的现有 packages.config 文件,而不是指定要安装的包。 该 install 命令将安装 packages.config 文件中列出的所有包。
nuget install packages.config
- 安装特定版本的包
nuget install <packageID | configFilePath> -Version <version>
注意:install 命令不会修改项目文件或 packages.config 文件。 install 和 restore 命令仅将包添加到磁盘,但不向项目添加依赖项。 若要添加项目依赖项,请通过 Visual Studio 包管理器 UI或包管理器控制台添加包。
- 更新所有包
使用 update 命令将项目 packages.config 文件中的所有包更新为其最新可用版本
nuget update
- 删除包
若要删除包,请从项目文件夹中删除该包。
从磁盘中删除包不会更新项目、packages.config 或 NuGet.Config 文件。 删除包的最佳方式是通过 IDE包管理器 UI 。
创建Nuget包
使用 dotnet CLI 创建 NuGet 包
设置属性:
配置项目文件(<项目名>.csproj)以指定包的元数据和依赖项。
例如,你可以添加版本号、描述、作者等元数据,以及任何其他依赖项。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageId>YourPackageId</PackageId>
<Version>1.0.0</Version>
<Authors>YourName</Authors>
<Description>Your package description</Description>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="YourPackageDependency" Version="1.0.0" />
</ItemGroup>
</Project>
运行创建命令:
dotnet pack -c Release
这将使用Release配置构建NuGet包,也可以使用-c Debug选项来构建Debug版本的包。
构建完成后,将在项目目录的bin\Release(或bin\Debug)子目录中生成一个NuGet包(.nupkg)。
使用 nuget.exe CLI 创建包
创建包清单(.nuspec)
nuget spec
清单:
介绍包的内容和自己是否包含在包中。
驱动包的创建并且指示 NuGet 如何将包安装到项目。 例如,清单识别其他包依赖项,这样,NuGet 还可以在安装主包时安装这些依赖项。
如下所示,包含所需属性和可选属性。 有关确切的详细信息(包括此处未提及的其他属性),请参阅 .nuspec 引用。
所需属性:
包标识符在承载包的库中必须是唯一的。
窗体 Major.Minor.Patch[-Suffix] 中特定的版本号,其中 -Suffix 标识预发布版本
包标题应出现在主机上(例如 nuget.org)
创建者和所有者信息。
对包的详细说明。
常见可选属性:
发行说明
版权信息
对 Visual Studio 中的包管理器 UI 的简短说明
区域设置 ID
项目 URL
作为表达式或文件的许可证(licenseUrl 将被弃用,请改为使用 license nuspec 元数据元素)
图标文件(iconUrl 将被弃用,请改为使用 icon nuspec 元数据元素)
依赖项和引用的列表
协助库搜索的标记
例如:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<!-- Identifier that must be unique within the hosting gallery -->
<id>Contoso.Utility.UsefulStuff</id>
<!-- Package version number that is used when resolving dependencies -->
<version>1.8.3</version>
<!-- Authors contain text that appears directly on the gallery -->
<authors>Dejana Tesic, Rajeev Dey</authors>
<!--
Owners are typically nuget.org identities that allow gallery
users to easily find other packages by the same owners.
-->
<owners>dejanatc, rjdey</owners>
<!-- Project URL provides a link for the gallery -->
<projectUrl>http://github.com/contoso/UsefulStuff</projectUrl>
<!-- License information is displayed on the gallery -->
<license type="expression">Apache-2.0</license>
<!-- Icon is used in Visual Studio's package manager UI -->
<icon>icon.png</icon>
<!--
If true, this value prompts the user to accept the license when
installing the package.
-->
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<!-- Any details about this particular release -->
<releaseNotes>Bug fixes and performance improvements</releaseNotes>
<!--
The description can be used in package manager UI. Note that the
nuget.org gallery uses information you add in the portal.
-->
<description>Core utility functions for web applications</description>
<!-- Copyright information -->
<copyright>Copyright ©2016 Contoso Corporation</copyright>
<!-- Tags appear in the gallery and can be used for tag searches -->
<tags>web utility http json url parsing</tags>
<!-- Dependencies are automatically installed when the package is installed -->
<dependencies>
<dependency id="Newtonsoft.Json" version="9.0" />
</dependencies>
</metadata>
<!-- A readme.txt to display when the package is installed -->
<files>
<file src="readme.txt" target="" />
<file src="icon.png" target="" />
</files>
</package>
运行创建命令:
nuget pack <清单名>.nuspec
构建完成后,将在当前目录中生成一个NuGet包文件(.nupkg)。
发布Nuget包
发布到nuget.org
若要在 nuget.org 上发布,请使用 Microsoft 帐户登录 nuget.org,并使用它创建 nuget.org 帐户。

上传过程:

使用命令行推送
dotnet CLI:
dotnet nuget push <包名>.nupkg -s <源URL> -k <API密钥>
将 <包名>.nupkg 替换为你的NuGet包的文件名,<源URL> 替换为你的NuGet存储库的URL,<API密钥> 替换为你的NuGet存储库的API密钥。这将将你的NuGet包发布到指定的NuGet存储库。
Nuget.exe CLI:
nuget push YourPackageName.nupkg -s <源URL> -k <API密钥>
将 YourPackageName.nupkg 替换为你的NuGet包的文件名,<源URL> 替换为你的NuGet存储库的URL,<API密钥> 替换为你的NuGet存储库的API密钥。这将将你的NuGet包发布到指定的NuGet存储库。
创建 API 密钥
-
登录你的 nuget.org 帐户,或创建一个帐户。
-
选择右上角的用户名,然后选择“API 密钥”。
-
选择“创建”,为秘钥提供一个名称。
-
在“选择范围”下,选择“推送”。
-
在“选择包>”“Glob 模式”下,输入 *。
-
选择创建。
-
选择“复制”以复制新秘钥。

本文介绍了NuGet,一个.NET平台的开源包管理工具,涵盖了包的创建、上传、引用,以及如何在IDE、dotnetCLI和NuGetCLI中进行包的管理,包括安装、更新、删除和发布到NuGet.org的过程。
325

被折叠的 条评论
为什么被折叠?



