创建 NuGet 包并拥有 .nupkg 文件后,可以公开或私密地向其他开发人员提供该包。 本文介绍如何通过 nuget.org 全局共享公共包。
还可以通过将专用包托管在文件共享、专用 NuGet 服务器或第三方存储库(如 myget、ProGet、Nexus 存储库或 Artifactory)上,使其仅对团队或组织可用。 有关详细信息,请参阅 托管自己的 NuGet 源。 若要使用 Azure Artifacts 进行发布,请参阅 将包发布到 NuGet.org。
发布到 nuget.org
若要在 nuget.org 上发布,请使用Microsoft帐户登录到 nuget.org,并使用它创建免费的 nuget.org 帐户。 遵循 “添加新个人帐户”中的说明。
拥有帐户后,可以使用 nuget.org Web 门户、dotnet CLI 或 NuGet CLI 4.1.0 或更高版本将包发布到 nuget.org。 还可以通过 Azure Pipelines 发布包。
上传到 nuget.org Web 门户
将包上传到 nuget.org 网站:
在 nuget.org 的顶部菜单中选择“ 上传 ”,浏览到计算机上的包,然后选择“ 打开”。
如果包 ID 已存在于 nuget.org,则会出现错误。 更改项目中的包标识符,重新打包,然后重试上传。
如果包名称可用,将打开 “验证 ”部分,以便查看包清单中的元数据。 如果在包中包含 自述文件 ,请选择 “预览 ”以确保所有内容都正确呈现。
若要更改任何元数据,请编辑项目文件或 .nuspec 文件、重新生成、重新打包和上传。
所有信息准备就绪后,选择“ 提交”。
使用命令行推送
若要使用命令行将包推送到 nuget.org,可以使用 dotnet.exe 或 nuget.exe v4.1.0 或更高版本来实现所需的 NuGet 协议。 有关详细信息,请参阅 NuGet 协议。
若要使用任一命令行,首先需要从 nuget.org 获取 API 密钥。
创建 API 密钥
登录到 nuget.org 帐户 ,或者创建一 个 帐户(如果还没有帐户)。
选择右上角的用户名,然后选择 API 密钥。
选择“ 创建”,并提供密钥的名称。
在选择范围中,选择推送。
在“选择包”>Glob 模式下,输入*。
选择 创建。
选择 “复制” 以复制新密钥。
重要
- 始终将 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
在命令提示符下运行以下命令,将
<your_API_key>替换为从 nuget.org 获取的密钥:nuget setApiKey <your_API_key>此命令将 API 密钥存储在 NuGet 配置中,因此无需在同一台计算机上再次输入 API 密钥。
注释
此 API 密钥不用于验证私有源。 若要管理用于使用这些源进行身份验证的凭据,请参阅 nuget sources 命令。
请使用以下命令来推送该包:
nuget push YourPackage.nupkg -Source https://api.nuget.org/v3/index.json
使用 Azure Pipelines 进行发布
可以使用 Azure Pipelines 将包推送到 nuget.org,作为持续集成/持续部署(CI/CD)过程的一部分。 有关详细信息,请参阅 使用 Azure Pipelines 发布 NuGet 包。
发布已签名的包
若要提交已签名的包,必须先注册用于对包进行签名的 证书 。 如果不满足 已签名的包要求,nuget.org 会拒绝该包。
包大小限制
Nuget.org 包大小限制约为 250 MB。 上传超出该限制的包时,将显示以下错误:
包文件超出大小限制。 请重试。
如果从命令行推送此类包,则会生成以下输出:
RequestEntityTooLarge https://www.nuget.org/api/v2/package/ 13903ms
error: Response status code does not indicate success: 413 (The package file exceeds the size limit. Please try again.).
如果收到此错误,请考虑修改包内容以减小其大小。 如果要将调试符号打包到包中,请考虑 单独发布它们。 其他资产可以单独发布为一个或多个依赖项包,以将它们分散到较小的区块中。
包验证和索引
推送到 nuget.org 的包会进行多项验证,例如病毒检查,并定期扫描现有包。 当包通过所有验证检查时,可能需要一段时间才能编制索引并在搜索结果中显示。 对包编制索引时,它将显示在 “未列出的包”下,并在包页上看到以下消息:
验证和索引完成后,你会收到一封电子邮件,指出包已成功发布。 如果包未通过验证检查,包页将更新以显示关联的错误,并且你会收到通知电子邮件。
包验证和索引通常需要不到 15 分钟。 如果包发布时间超过预期,请检查 status.nuget.org 时的 nuget.org 状态。如果所有系统都正常运行,并且包未在一小时内成功发布,请使用包页上的 “联系支持 ”链接联系 nuget.org。
若要查看包状态,请选择 nuget.org 右上角帐户名称下的 “管理包 ”,然后从 “已发布的包 ”或 “未列出的包”中选择包。
在 nuget.org 上管理包所有者
包所有者具有包的完整权限,包括添加和删除其他所有者和发布更新。
尽管 NuGet 包的 .nuspec 文件定义了包的作者,但 nuget.org 不使用该元数据来定义所有权。 相反,nuget.org 将包的所有权分配给发布包的人员:要么是上传包的已登录用户,要么是使用 API 密钥与 dotnet push、nuget SetApiKey 或 nuget push 上传包的用户。
更改软件包所有权的步骤:
使用当前拥有包的帐户登录到 nuget.org。
选择右上角的帐户名称,选择管理包,然后展开已发布的包。
选择要管理的包,然后在包页的右侧,选择“ 管理包”。
在包管理页上,选择“ 所有者”。
请执行以下一项操作:
选择 “删除” 以删除当前所有者。
输入其用户名和消息并选择“添加”,在“添加所有者”下添加所有者。
该操作发送带有确认链接的电子邮件给新共同所有者。 确认后,该人员具有添加和删除所有者的完整权限。 在确认之前,“当前所有者” 部分会显示该人的待批准状态。
若要转移所有权,例如在所有权发生更改或包在错误的帐户下发布时,请添加新所有者。 确认所有权后,他们可以从列表中删除旧所有者。
若要将所有权分配给公司或组,请使用电子邮件别名创建一个 nuget.org 帐户,该别名将转发给相应的团队成员。 例如, microsoft 和aspnet 帐户共同拥有各种Microsoft ASP.NET 包。
有时,一个包可能没有当前的负责人。 例如,原始所有者可能已离开生产包的公司。 如果你是包的合法所有者,并且需要重新获得所有权,请使用 nuget.org 上的 联系人表单 向 NuGet 团队解释你的情况。 团队遵循一个过程来验证所有权,包括尝试查找现有所有者,并可以向你发送成为包所有者的新邀请。