发布 NuGet 包

创建 NuGet 包并具有 .nupkg 文件后,可以公开或私密地向其他开发人员提供该包。 本文介绍如何通过 nuget.org 全局共享公共包。

通过以下方式可以仅向团队或组织提供专用包:在文件共享、专用 NuGet 服务器、Azure Artifacts 或第三方存储库(如 myget、ProGet、Nexus 存储库和 Artifactory)上承载专用包。 有关详细信息,请参阅 托管自己的 NuGet 源。 若要使用 Azure Artifacts 进行发布,请参阅 将包发布到 NuGet.org

发布到 nuget.org

若要在 nuget.org 上发布,请使用 Microsoft 帐户登录 nuget.org,并使用它创建免费的 nuget.org 帐户。 按照“ 添加新的个人帐户”中的说明进行操作。

显示 NuGet 登录链接的屏幕截图。

拥有帐户后,可以使用 nuget.org Web 门户、dotnet CLI 或 NuGet CLI 4.1.0 或更高版本将包发布到 nuget.org。 还可以通过 Azure Pipelines 发布包。

上传到 nuget.org Web 门户

将包上传到 nuget.org 网站:

  1. 选择 nuget.org 顶部菜单上的 “上传 ”,浏览到计算机上的包,然后选择“ 打开”。

    显示 nuget.org 上的“上传”对话框的屏幕截图

    如果包 ID 已存在于 nuget.org 上,则会出现错误。 如果无法使用,则更改项目中的包标识符、重新生成,并重试上传。

  2. 如果包名称可用,nuget.org 将打开“验证” 部分,可以在其中查看包清单中的元数据。 如果在包中包含 自述文件 ,请选择 “预览” 以确保所有内容都正确呈现。

    若要更改任何元数据,请编辑项目(项目文件或 文件)、重新生成、重新创建包,然后再次上传。

  3. 当所有信息准备就绪后,选择“提交” 按钮

使用命令行推送

若要使用命令行将包推送到 nuget.org,可以使用 dotnet.exenuget.exe v4.1.0 或更高版本来实现所需的 NuGet 协议。 有关详细信息,请参阅 NuGet 文档

若要使用任一命令行,首先需要从 nuget.org 获取 API 密钥。

创建 API 密钥

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

  2. 选择用户名(在右上角),然后选择“API 密钥”。

  3. 选择 “创建”,并提供密钥的名称。

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

  5. “选择包>Glob 模式”下,输入 *。

  6. 选择“创建”。

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

    显示包含“复制”链接的新 API 密钥的屏幕截图。

重要

  • 始终将 API 密钥保留为机密! 将 API 密钥视为密码,使任何人都可以代表你管理包。 如果 API 密钥意外显示,则应删除或重新生成密钥。
  • 将密钥保存在安全位置,因为以后无法再次复制密钥。 如果返回到 API 密钥页,则需要重新生成密钥以对其进行复制。 如果你不再希望推送包,还可以删除 API 密钥。

范围允许创建针对不同用途的单独 API 密钥。 每个密钥都有到期时间范围,可以将密钥范围限定为特定的包或 glob 模式。 还可以将每个密钥范围限定为特定操作:推送新包和包版本、仅推送新包版本或取消列出。

通过范围限定,可以为管理组织不同包的不同人员创建 API 密钥,这样他们就只有所需的权限。 有关详细信息,请参阅范围内的 API 密钥

使用 dotnet CLI

从包含 .nupkg 文件的文件夹运行以下命令。 指定 .nupkg 文件名,并将密钥值替换为 API 密钥。

dotnet nuget push Contoso.08.28.22.001.Test.1.0.0.nupkg --api-key qz2jga8pl3dvn2akksyquwcs9ygggg4exypy3bhxy6w6x6 --source https://api.nuget.org/v3/index.json

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

Pushing Contoso.08.28.22.001.Test.1.0.0.nupkg to 'https://www.nuget.org/api/v2/package'...
  PUT https://www.nuget.org/api/v2/package/
warn : All published packages should have license information specified. Learn more: https://aka.ms/nuget/authoring-best-practices#licensing.
  Created https://www.nuget.org/api/v2/package/ 1221ms
Your package was pushed.

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

注意

如果要避免测试包在 nuget.org 上实时运行,则可以推送到 nuget.org 测试站点。 https://int.nugettest.org请注意,上载到 int.nugettest.org 的包可能无法保留。

请使用 NuGet CLI 或 dotnet CLI。

  1. 在命令提示符处运行以下命令,将 <your_API_key> 替换为从 nuget.org 获取的密钥:

    nuget setApiKey <your_API_key>
    

    此命令将 API 密钥存储在 NuGet 配置中,以便无需在同一台计算机上再次重复此步骤。

    注意

    此 API 密钥不用于通过专用源进行身份验证。 若要管理使用这些源进行身份验证的凭据,请参阅 nuget sources 命令

  2. 使用以下命令推送包:

    nuget push YourPackage.nupkg -Source https://api.nuget.org/v3/index.json
    

使用 Azure Pipelines 发布

可将包推送到使用 Azure Pipelines nuget.org,作为持续集成/持续部署 (CI/CD) 过程的一部分。 有关详细信息,请参阅通过 Azure Functions 使用 NuGet 包

发布已签名的包

若要提交已签名的包,必须先注册用于对包进行签名的 证书 。 如果不满足 已签名的包要求,nuget.org 会拒绝该包。

包验证和编制索引

推送到 nuget.org 的包会经过多项验证,例如病毒检查,并定期扫描现有包。 包通过所有验证检查后,对包编制索引并将其显示在搜索结果中可能需要一些时间。 对包编制索引时,它将显示在 “未列出包”下,并在包页上看到以下消息:

指示尚未发布包的消息的屏幕截图。

编制索引完成后,你会收到一封确认已成功发布包的电子邮件。 如果包未通过验证检查,将更新包详细信息页面以显示相关错误,同时你也会收到包含相关通知的电子邮件。

包验证和索引通常需要不到 15 分钟。 如果包发布花费的时间超过预期,请检查 status.nuget.org 时的 nuget.org 状态。如果所有系统都正常运行,并且包在一小时内未成功发布,请使用包页上的 “联系支持 ”链接联系 nuget.org。

若要查看包状态,请选择 nuget.org 右上角帐户名称下的 “管理包 ”,然后从 已发布的包未列出的包中选择包

在 nuget.org 上管理包所有者

所有包所有者均拥有包的完全权限,包括添加和删除其他所有者以及发布更新。

尽管每个 NuGet 包的 文件定义了该包的创建者,但 nuget.org 库不使用该元数据定义所有权。 相反,nuget.org 将所有权分配给发布包的人员、上传包的已登录用户,或者向其使用 dotnet pushnuget SetApiKeyAPI 密钥的用户,或者nuget push

要更改包的所有权,请执行以下操作:

  1. 使用包的当前所有者的帐户登录 nuget.org。

  2. 选择帐户名称,选择“管理包” ,然后展开“已发布的包” 。

  3. 选择要管理的包,然后在包页的右侧,选择“ 管理包”。

  4. 在包管理页上,选择“ 所有者”。

  5. 请执行以下一项操作:

    • 选择 “删除 ”以删除当前所有者。

    • 在“添加所有者” 下添加所有者,方法是通过输入其用户名和一条消息,然后选择“添加” 。

      此操作会向该新共有者发送包含确认链接的电子邮件。 确认后,此人拥有添加和删除所有者的完全权限。 在确认之前, “当前所有者 ”部分会显示该人员的待批准。

若要转移所有权,就像所有权更改或包在错误的帐户下发布时一样,请添加新所有者。 确认所有权后,他们可以从列表中删除旧所有者。

要将所有权分配给公司或组,请使用转发到适当团队成员的电子邮件别名创建 nuget.org 帐户。 例如,各种 Microsoft ASP.NET 包由 microsoftaspnet 帐户共同拥有,这两个帐户就是此类别名。

有时,包所有者可能不太活跃。 例如,原始所有者可能离开了生产包的公司。 如果你是包的合法所有者且需要重新获得所有权,请使用 nuget.org 上的联系表单向 NuGet 团队解释相关情况。 团队遵循一个过程来验证所有权,包括尝试查找现有所有者,并可以向你发送新的邀请以成为包所有者。

后续步骤