跳至主要内容

使用 NuGet 注册表

您可以配置 dotnet 命令行界面 (CLI) 以将 NuGet 包发布到 GitHub Packages,并在 .NET 项目中使用存储在 GitHub Packages 上的包作为依赖项。

谁可以使用此功能?

GitHub Packages 可用于 GitHub Free、GitHub Pro、GitHub Free for organizations、GitHub Team、GitHub Enterprise Cloud 和 GitHub Enterprise Server 3.0 或更高版本。


GitHub Packages 不适用于使用传统按仓库付费计划的帐户拥有的私有仓库。此外,使用传统按仓库付费计划的帐户无法访问支持细粒度权限的注册表,因为这些帐户按仓库计费。有关支持细粒度权限的注册表列表,请参阅“关于 GitHub Packages 的权限”。有关更多信息,请参阅“GitHub 的计划”。

对 GitHub Packages 进行身份验证

GitHub Packages 仅支持使用个人访问令牌(经典)进行身份验证。有关更多信息,请参阅“管理您的个人访问令牌”。

您需要访问令牌才能发布、安装和删除私有、内部和公共包。

您可以使用个人访问令牌(经典)对 GitHub Packages 或 GitHub API 进行身份验证。创建个人访问令牌(经典)时,您可以根据需要为令牌分配不同的范围。有关个人访问令牌(经典)的与包相关的范围的更多信息,请参阅“关于 GitHub Packages 的权限”。

在 GitHub Actions 工作流程中,您可以使用以下方法对 GitHub Packages 注册表进行身份验证:

  • GITHUB_TOKEN 用于发布与工作流程存储库关联的软件包。
  • 具有至少 read:packages 范围的个人访问令牌(经典)用于安装与其他私有存储库关联的软件包(GITHUB_TOKEN 无法访问)。

在 GitHub Actions 工作流程中进行身份验证

此注册表支持细粒度权限。对于支持细粒度权限的注册表,如果您的 GitHub Actions 工作流程使用个人访问令牌对注册表进行身份验证,我们强烈建议您更新工作流程以使用 GITHUB_TOKEN。有关更新使用个人访问令牌对注册表进行身份验证的工作流程的指南,请参阅“使用 GitHub Actions 发布和安装软件包”。

注意:GitHub Actions 工作流程使用 REST API 删除和恢复软件包的功能目前处于公开测试阶段,可能会发生变化。

如果令牌对软件包具有 admin 权限,您可以在 GitHub Actions 工作流程中使用 GITHUB_TOKEN 通过 REST API 删除或恢复软件包。使用工作流程发布软件包的存储库以及您已明确连接到软件包的存储库会自动获得对存储库中软件包的 admin 权限。

有关 GITHUB_TOKEN 的更多信息,请参阅“自动令牌身份验证”。有关在操作中使用注册表的最佳实践的更多信息,请参阅“GitHub Actions 安全加固”。

使用以下命令在 GitHub Actions 工作流程中使用 GITHUB_TOKEN 对 GitHub Packages 进行身份验证,而不是在存储库的 nuget.config 文件中硬编码个人访问令牌

dotnet nuget add source --username USERNAME --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/NAMESPACE/index.json"

NAMESPACE 替换为软件包范围的个人帐户或组织的名称。

您也可以选择独立地为 GitHub Codespaces 和 GitHub Actions 提供包的访问权限。有关更多信息,请参阅“配置包的访问控制和可见性”和“配置包的访问控制和可见性”。

使用个人访问令牌进行身份验证

GitHub Packages 仅支持使用个人访问令牌(经典)进行身份验证。有关更多信息,请参阅“管理您的个人访问令牌”。

您需要访问令牌才能发布、安装和删除私有、内部和公共包。

您可以使用个人访问令牌(经典)对 GitHub Packages 或 GitHub API 进行身份验证。创建个人访问令牌(经典)时,您可以根据需要为令牌分配不同的范围。有关个人访问令牌(经典)的与包相关的范围的更多信息,请参阅“关于 GitHub Packages 的权限”。

在 GitHub Actions 工作流程中,您可以使用以下方法对 GitHub Packages 注册表进行身份验证:

  • GITHUB_TOKEN 用于发布与工作流程存储库关联的软件包。
  • 具有至少 read:packages 范围的个人访问令牌(经典)用于安装与其他私有存储库关联的软件包(GITHUB_TOKEN 无法访问)。

您必须使用具有适当范围的个人访问令牌(经典)才能在 GitHub Packages 中发布和安装包。有关更多信息,请参阅“GitHub Packages 简介”。

要使用 dotnet 命令行界面 (CLI) 对 GitHub Packages 进行身份验证,请在您的项目目录中创建一个 nuget.config 文件,并在 packageSources 下为 dotnet CLI 客户端指定 GitHub Packages 作为源。

您必须替换

  • USERNAME 为您在 GitHub 上的个人帐户名称。
  • TOKEN 为您的个人访问令牌(经典)。
  • NAMESPACE 为您的包所关联的个人帐户或组织的名称。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <packageSources>
        <clear />
        <add key="github" value="https://nuget.pkg.github.com/NAMESPACE/index.json" />
    </packageSources>
    <packageSourceCredentials>
        <github>
            <add key="Username" value="USERNAME" />
            <add key="ClearTextPassword" value="TOKEN" />
        </github>
    </packageSourceCredentials>
</configuration>

发布包

您可以通过使用 nuget.config 文件进行身份验证,或使用 --api-key 命令行选项以及您的 GitHub 个人访问令牌(经典)来将包发布到 GitHub Packages。

NuGet 注册表将包存储在您的组织或个人帐户中,并允许您将包与存储库关联。您可以选择从存储库继承权限,或独立于存储库设置细粒度的权限。

首次发布包时,默认可见性为私有。要更改可见性或设置访问权限,请参阅“配置包的访问控制和可见性”。有关将已发布的包与存储库链接的更多信息,请参阅“将存储库连接到包”。

如果您在 nuget.config 文件中指定了 RepositoryURL,发布的包将自动连接到指定的存储库。有关更多信息,请参阅“使用 NuGet 注册表进行操作”。有关将已发布的包链接到存储库的信息,请参阅“将存储库连接到包”。

使用 GitHub 个人访问令牌作为 API 密钥发布包

如果您还没有在 GitHub.com 上用于帐户的个人访问令牌,请参阅“管理您的个人访问令牌”。

  1. 创建一个新项目。将 PROJECT_NAME 替换为您要为项目指定的名称。

    dotnet new console --name PROJECT_NAME
    
  2. 打包项目。

    dotnet pack --configuration Release
    
  3. 使用您的个人访问令牌作为 API 密钥发布包。将 PROJECT_NAME 替换为项目的名称,将 1.0.0 替换为包的版本号,将 YOUR_GITHUB_PAT 替换为您的个人访问令牌。

    dotnet nuget push "bin/Release/PROJECT_NAME.1.0.0.nupkg"  --api-key YOUR_GITHUB_PAT --source "github"
    

发布包后,您可以在 GitHub 上查看该包。有关更多信息,请参阅“查看包”。

使用 nuget.config 文件发布包

发布时,如果您将包链接到存储库,则 .csproj 文件中指定的存储库的 OWNER 必须与 nuget.config 身份验证文件中使用的 NAMESPACE 相匹配。在 .csproj 文件中指定或递增版本号,然后使用 dotnet pack 命令为该版本创建 .nuspec 文件。有关创建包的更多信息,请参阅 Microsoft 文档中的“创建和发布包”。

注意:如果您发布了链接到存储库的包,则该包会自动继承链接存储库的访问权限,并且链接存储库中的 GitHub Actions 工作流会自动获得对该包的访问权限,除非您的组织禁用了自动继承访问权限。有关更多信息,请参阅“配置包的访问控制和可见性”。

  1. 验证 GitHub 包。有关更多信息,请参阅“验证 GitHub 包”。

  2. 创建一个新项目。将 PROJECT_NAME 替换为您要为项目指定的名称。

    dotnet new console --name PROJECT_NAME
    
  3. 将项目的特定信息添加到项目的以 .csproj 结尾的文件中。确保将

    • 1.0.0 替换为包的版本号。
    • OWNER 替换为要将包链接到的存储库所属的个人帐户或组织的名称。
    • REPOSITORY 替换为要将包连接到的存储库的名称。
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <PackageId>PROJECT_NAME</PackageId>
        <Version>1.0.0</Version>
        <Authors>AUTHORS</Authors>
        <Company>COMPANY_NAME</Company>
        <PackageDescription>PACKAGE_DESCRIPTION</PackageDescription>
        <RepositoryUrl>https://github.com/OWNER/REPOSITORY</RepositoryUrl>
      </PropertyGroup>
    
    </Project>
    
  4. 打包项目。

    dotnet pack --configuration Release
    
  5. 使用您在 nuget.config 文件中指定的 key 发布包。将 PROJECT_NAME 替换为项目的名称,并将 1.0.0 替换为包的版本号。

    dotnet nuget push "bin/Release/PROJECT_NAME.1.0.0.nupkg" --source "github"
    

发布包后,您可以在 GitHub 上查看该包。有关更多信息,请参阅“查看包”。

将多个包发布到同一个存储库

要将多个包连接到同一个存储库,请在所有 .csproj 项目文件中的 RepositoryURL 字段中使用相同的 GitHub 存储库 URL。GitHub 会根据该字段匹配存储库。

以下示例将 MY_APP 和 MY_OTHER_APP 项目发布到同一个存储库

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <PackageId>MY_APP</PackageId>
    <Version>1.0.0</Version>
    <Authors>Octocat</Authors>
    <Company>GitHub</Company>
    <PackageDescription>This package adds a singing Octocat!</PackageDescription>
    <RepositoryUrl>https://github.com/my-org/my-repo</RepositoryUrl>
  </PropertyGroup>

</Project>
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <PackageId>MY_OTHER_APP</PackageId>
    <Version>1.0.0</Version>
    <Authors>Octocat</Authors>
    <Company>GitHub</Company>
    <PackageDescription>This package adds a dancing Octocat!</PackageDescription>
    <RepositoryUrl>https://github.com/my-org/my-repo</RepositoryUrl>
  </PropertyGroup>

</Project>

安装包

在项目中使用来自 GitHub 的包与使用来自 nuget.org 的包类似。将包依赖项添加到 .csproj 文件中,指定包名称和版本。有关在项目中使用 .csproj 文件的更多信息,请参阅 Microsoft 文档中的“使用 NuGet 包”。

  1. 验证 GitHub 包。有关更多信息,请参阅“验证 GitHub 包”。

  2. 要使用包,请添加 ItemGroup 并配置 .csproj 项目文件中的 PackageReference 字段。将 Include="PACKAGE_NAME" 中的 PACKAGE_NAME 值替换为您的包依赖项,并将 Version="X.X.X" 中的 X.X.X 值替换为要使用的包的版本

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <PackageId>My-app</PackageId>
        <Version>1.0.0</Version>
       <Authors>Octocat</Authors>
        <Company>GitHub</Company>
       <PackageDescription>This package adds an Octocat!</PackageDescription>
        <RepositoryUrl>https://github.com/OWNER/REPOSITORY</RepositoryUrl>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="PACKAGE_NAME" Version="X.X.X" />
      </ItemGroup>
    
    </Project>
    
  3. 使用 restore 命令安装包。

    dotnet restore
    

故障排除

如果您使用 GITHUB_TOKEN 在 GitHub Actions 工作流中验证 GitHub Packages 注册表,则该令牌无法访问与工作流运行所在的存储库不同的其他存储库中的私有存储库级包。要访问与其他存储库关联的包,请改为生成具有 read:packages 范围的个人访问令牌(经典),并将此令牌作为秘密传递。

进一步阅读