快速入门:使用 Visual Studio 创建和发布 NuGet 包(仅限 Windows)

在本快速入门中,你将使用Microsoft Visual Studio从.NET类库创建 NuGet 包。 然后使用命令行接口 (CLI) 工具将包发布到 nuget.org。

本快速入门仅适用于Windows用户。 如果使用其他平台,请使用 .NET CLI

先决条件

  • Visual Studio 2026,其中包含与.NET相关的工作负荷。

    可以从 visualstudio.microsoft.com 免费安装 2026 Community 版本,也可以使用专业版或企业版。

    安装与.NET相关的工作负荷时,Visual Studio 2017 及更高版本会自动包含 NuGet 功能。

  • .NET CLI。

    对于 Visual Studio 2017 及更高版本,.NET CLI 会自动随任何.NET相关工作负荷一起安装。 还可以安装 .NET SDK以获取 .NET CLI。 使用 SDK 样式格式(和 SDK 属性)的.NET项目需要使用 .NET CLI。 Visual Studio 2017 及更高版本中的默认 .NET 类库模板使用 SDK 属性。

    重要

    如果使用非 SDK 风格项目,请改为按照 使用 Visual Studio (.NET Framework, Windows) 创建和发布包 的步骤。 在本文中,建议使用 .NET CLI。 尽管可以使用 NuGet CLI 发布任何 NuGet 包,但本文中的一些步骤特定于 SDK 样式的项目和 .NET CLI。 NuGet CLI 用于 非 SDK 风格的项目(通常 .NET 框架项目)。

  • nuget.org 上的免费帐户。必须先注册并确认帐户,然后才能上传 NuGet 包。

  • NuGet CLI。 可以通过从 nuget.org 下载它来安装它。将 nuget.exe 文件添加到合适的文件夹,并将该文件夹添加到 PATH 环境变量。

创建类库项目

可以将现有.NET类库项目用于要打包的代码,也可以通过执行以下步骤创建一个类库项目:

  1. 在 Visual Studio 中,选择 File>New>Project/Solution

  2. 在“ 创建新项目 ”窗口中,转到搜索框并输入 类库

  3. 在项目模板的结果列表中,选择满足以下条件的 类库 模板:

    • 具有 A 项目的说明,用于创建面向 .NET 或 .NET Standard 的类库
    • 具有 C# 标记

    选择“下一步”。

  4. 配置新的 project 窗口中,对于 Project name,输入 AppLogger,然后选择 Next

  5. 在“ 其他信息 ”窗口中,为 框架选择适当的值,然后选择“ 创建”。

    如果不确定要选择哪个框架,则最新框架是一个不错的选择,以后可以轻松更改。 有关要使用的框架的信息,请参阅何时面向netx.0netstandard

  6. (可选)对于本快速入门,无需为 NuGet 包编写任何其他代码,因为模板类库足以创建包。 但是,如果要向包中添加一些功能代码,请包含以下代码:

    namespace AppLogger
    {
        public class Logger
        {
            public void Log(string text)
            {
                Console.WriteLine(text);
            }
        }
    }
    

配置包属性

创建项目后,可以按照以下步骤配置 NuGet 包属性:

  1. 解决方案资源管理器中,选择您的项目,然后选择项目><,其中>项目名称是您的项目的名称。

  2. 展开 节点,然后选择 常规

    节点仅适用于 Visual Studio 中的 SDK 样式项目。 如果要面向非 SDK 样式项目(通常是 .NET Framework 项目),迁移项目,或查看 使用 Visual Studio(.NET Framework,Windows)创建并发布包以获取分步说明。

     Visual Studio 中的项目属性窗口截图。NuGet 包的常规属性可见,例如包 ID 和标题。

  3. 对于 包 ID,请为包提供唯一 ID。

    重要

    你必须为包提供在所使用的主机中唯一的标识符,例如 nuget.org。否则,将发生错误。 对于本快速入门,我们建议在 ID 中包含 示例测试 ,因为发布步骤使包公开可见。 有关选择 ID 的详细信息,请参阅 包标识符的最佳做法

  4. 填写任何其他所需属性。 对于为公共使用的包,请特别注意 Tags 属性,因为标记可帮助其他人找到你的包并了解它的作用。

    所有属性都包含在 Visual Studio 为项目创建的.nuspec清单中。 有关显示 SDK 样式项目中Microsoft Build (MSBuild) 属性如何映射到 .nuspec 文件属性的表,请参阅 pack 目标。 有关 .nuspec 文件属性的说明,请参阅 .nuspec 参考

  5. (可选)若要直接在 AppLogger.csproj 项目文件中查看属性,请选择 Project>编辑项目文件

    AppLogger.csproj 文件将在新选项卡中打开。

    此选项适用于使用 SDK 样式属性的项目。

运行 pack 命令

若要从项目创建 NuGet 包,请执行以下步骤:

  1. 选择 Build>Configuration Manager,然后将 Active solution configuration 值设置为 Release

  2. Solution Explorer 中,右键单击 AppLogger 项目,然后选择 Pack

    Visual Studio 生成项目并创建 .nupkg 文件。

  3. 检查 “输出 ”窗口以了解详细信息,包括包文件的路径。 在此示例中,生成的程序集位于 bin\Release\net8.0 文件夹中,该文件夹适用于 .NET 8.0 目标:

    1>------ Build started: Project: AppLogger, Configuration: Release Any CPU ------
    1>  AppLogger -> d:\proj\AppLogger\AppLogger\bin\Release\net8.0\AppLogger.dll
    1>  Successfully created package 'd:\proj\AppLogger\AppLogger\bin\Release\Contoso.App.Logger.Test.1.0.0.nupkg'.
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    

如果菜单中缺少 Pack 命令,则项目可能不是 SDK 样式项目。 执行以下步骤之一:

  • 升级项目来使用 .NET CLI。
  • 按照 使用 Visual Studio(.NET Framework,Windows)创建和发布包的说明,使用 NuGet CLI 从你的项目中创建和发布 NuGet 包。

(可选)在生成时生成包

可以在生成项目时将 Visual Studio 配置为自动生成 NuGet 包:

  1. Solution Explorer 中选择您的项目,然后选择 项目项目名称 属性,其中 项目名称 是您的项目的名称(在本例中为AppLogger)。

  2. 展开 节点,选择 常规,然后在生成 上选择生成 NuGet 包。

     Visual Studio 中项目属性窗口的Screenshot。在“常规属性”部分中,“生成 NuGet 包”选项处于选中状态。

注意

选择此选项时,生成包所需的额外时间会增加项目的总体生成时间。

(可选)使用 MSBuild 打包

作为使用 “包” 菜单命令的替代方法,可以使用 msbuild -t:pack 该命令从项目生成 NuGet 包。 当项目包含必要的包数据时,NuGet 4.x+ 和 MSBuild 15.1+ 支持 pack 目标。

  1. Solution Explorer中打开项目后,通过选择Tools>Command Line>Developer 命令提示符打开命令提示符窗口。

    命令提示符窗口将在项目目录中打开。

  2. 运行以下命令:msbuild -t:pack

有关详细信息,请参阅 使用 MSBuild 创建 NuGet 包

发布这个包

创建 .nupkg 文件后,请执行以下部分中的步骤将其发布到 nuget.org。可以使用 .NET CLI 或 NuGet CLI 进行发布。 还可以使用从 nuget.org 获取的 API 密钥。

注意

  • Nuget.org 扫描所有上传的程序包以检测病毒,并拒绝包含病毒的任何程序包。 Nuget.org 还会定期扫描所有现有列出的包。

  • 发布到 nuget.org 的包对其他开发人员公开可见,除非取消列出它们。 若要私下托管包,请参阅 “托管自己的 NuGet 源”。

获取 API 密钥

在发布 NuGet 包之前,请创建 API 密钥:

  1. 登录到 nuget.org 帐户 ,或者创建一 帐户(如果还没有帐户)。

  2. 在右上角,选择用户名,然后选择 API 密钥

  3. 选择“ 创建”,然后输入密钥的名称。

  4. “选择范围”下,选择 “推送”

  5. “选择包”下,对于 Glob 模式,输入星号 (*)。

  6. 选择 创建

  7. 选择 复制 以复制新密钥。

    nuget.org 页的屏幕截图,其中显示了新的 API 密钥、有关立即复制密钥的消息,以及突出显示的“复制”按钮。

重要

  • 始终将 API 密钥保留为机密。 API 密钥就像一个密码,任何人都可以用它替你管理包。 如果 API 密钥意外泄露,请将其删除或重新生成。
  • 将密钥保存在安全的位置,因为以后无法再次复制密钥。 如果返回到 API 密钥页,则需要重新生成密钥以复制密钥。 如果不再需要推送包,还可以删除 API 密钥。

作用域 提供了一种方法,用于为不同的目的创建单独的 API 密钥。 每个密钥都有一个过期时间范围,可以将密钥限定为特定包或 glob 模式。 还可以将每个密钥限定为特定操作:推送新包和包版本、仅推送新包版本或取消列表。

通过范围,可以为管理组织包的不同人员创建 API 密钥,以便他们仅具有所需的权限。

有关详细信息,请参阅 作用域 API 密钥

使用 .NET CLI 或 NuGet CLI 进行发布

可以使用 .NET CLI 或 NuGet CLI 将包推送到服务器并将其发布。 转到要使用的工具的选项卡。

.NET CLI(dotnet.exe)是 NuGet CLI 的建议替代方法。

从包含 .nupkg 文件的文件夹运行以下命令。 将 <package-file> 替换为您的 .nupkg 文件的名称,将 <API-key> 替换为您的 API 密钥。

dotnet nuget push <package-file> --api-key <API-key> --source https://api.nuget.org/v3/index.json

输出显示发布过程的结果:

Pushing <package-file> to 'https://www.nuget.org/api/v2/package'...
  PUT https://www.nuget.org/api/v2/package/
  Created https://www.nuget.org/api/v2/package/ 2891ms
Your package was pushed.

有关详细信息,请参阅 dotnet nuget 推送

发布过程中的错误

运行 push 命令时,有时会遇到错误。 例如,在以下情况下可能会出现错误:

  • API 密钥无效或已过期。
  • 您尝试发布一个包,但该包的标识符已存在于主机上。
  • 对已发布的包进行更改,但在再次尝试发布版本号之前,忘记更新版本号。

错误消息通常指示问题的来源。

例如,假设标识符 Contoso.App.Logger.Test 存在于 nuget.org 上。如果尝试发布具有该标识符的包,则会出现以下错误:

Response status code does not indicate success: 403 (The specified API key is invalid, has expired, or does not have permission to access the specified package.).

若要解决此问题,请检查 API 密钥的范围、到期日期和值。 如果密钥有效,则错误指示主机上已存在包标识符。 若要解决此问题,请将包标识符更改为唯一,重新生成项目,重新创建 .nupkg 文件,然后重试 push 该命令。

管理已发布的包

成功发布包后,会收到确认电子邮件。 若要查看已发布的包,请转到 nuget.org,选择右上角的用户名,然后选择“ 管理包”。

注意

可能需要一段时间才能为您的包进行索引并显示在搜索结果中,以便其他人可以找到它。 在此期间,您的包裹会列在 未列出的包裹下,包裹页面显示以下消息:

有关尚未发布的软件包的 nuget.org 警告消息的屏幕截图。文本指出验证和索引可能需要一小时。

在 nuget.org 发布 NuGet 包后,其他开发人员可以在其项目中使用它。

如果创建无效的包(例如来自空类库的此示例包),或者不希望包可见,则可以 取消列出 包以将其从搜索结果中隐藏:

  1. 在软件包显示在“管理包”页面的“已发布包”下后,选择软件包列表旁边的铅笔图标。

    “nuget.org 包”页的屏幕截图。“已发布的包”部分列出了一个包。其编辑图标突出显示。

  2. 在下一页上,选择“ 列出”,清除 搜索结果中的“列表 ”复选框,然后选择“ 保存”。

    nuget.org 页的屏幕截图。在“列表”部分中,突出显示了在搜索结果中列出包的选项。

包现在显示在 管理包未列出的包 下,不再显示在搜索结果中。

注意

为了避免测试包在 nuget.org 上实时运行,可以在 https://int.nugettest.org推送到 nuget.org 测试站点。请注意,上载到 int.nugettest.org 的包可能不会保留。

添加自述文件或其他文件

可以在包中包含一个自述文件或其他文件。

添加README文件

若要向包添加自述文件,请执行以下步骤:

  1. 通过选择项目>编辑项目文件打开项目文件。

  2. 在项目文件中,转到 PropertyGroup 元素,然后添加子 PackageReadmeFile 元素:

    <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
            ...
            <PackageReadmeFile>readme.md</PackageReadmeFile>
            ...
        </PropertyGroup>
    </Project>
    
  3. 转到 ItemGroup 元素,然后添加子 None 元素:

    <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
            ...
            <PackageReadmeFile>readme.md</PackageReadmeFile>
            ...
        </PropertyGroup>
    
        <ItemGroup>
            ...
            <None Include="readme.md" Pack="true" PackagePath="\" />
            ...
        </ItemGroup>
    </Project>
    

在前面的示例中,该属性指定项目根目录中名为 readme.md 的文件。 生成、打包和发布包后,nuget.org 在包页上显示自述文件的内容。 Visual Studio还会在Package Manager UI 中显示该文件的内容。

例如,以下屏幕截图显示了 HtmlAgilityPack 包的自述文件:

Visual Studio 包管理器 UI 的屏幕截图,显示一个包详细信息窗格。README 选项卡描述了该包的 HTML 解析功能。

添加其他文件

若要将其他文件添加到包中,请通过选择Project>Edit Project File 打开项目文件。 然后将Content子元素添加到ItemGroup元素中:

<ItemGroup>
  <Content Include="other-content.md">
    <Pack>true</Pack>
    <PackagePath>\</PackagePath>
  </Content>
</ItemGroup>

有关详细信息,请参阅《在包中包含内容》。

有关使用 NuGet 进行包管理的视频,请参阅 .NET Package Management with NuGet for BeginnersNuGet for Beginners

若要了解如何使用 Visual Studio .NET Framework 创建 NuGet 包,请参阅 使用 nuget.exe CLI 创建包

有关 NuGet 的详细信息,请参阅以下文章: