GitHub Actions无法找到GitHub Packages托管的NuGet包
我在GitHub组织下维护两个私有仓库:Library和App。Library已通过GitHub Action成功将NuGet包推送到GitHub Packages,本地使用个人访问令牌(PAT)可以正常拉取该包并作为App项目的依赖。但在为App编写构建和单元测试的GitHub Action时,遇到了问题:
已配置NuGet包源步骤:
- name: Set package source run: dotnet nuget add source --username USERNAME --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/REDACTED/index.json"
执行dotnet restore时出现错误:
/home/runner/work/App/App/App.Services/App.Services.csproj : error NU1101:
Unable to find package Library. No packages exist with this id in source(s): github, nuget.org [/home/runner/work/App/App/App.sln]
我知道可以通过新增PAT解决,但出于安全和管理便利,希望依赖默认的GITHUB_TOKEN,且根据GitHub文档,GITHUB_TOKEN默认拥有包的读写权限。
1. 显式配置GITHUB_TOKEN的包读取权限
默认GITHUB_TOKEN在跨仓库访问场景下,可能缺乏足够权限。在工作流文件的开头添加权限声明,确保它能读取组织内的Packages:
permissions: packages: read
2. 修正NuGet源配置的用户名
GitHub Packages对用户名的要求是非空即可,但硬编码USERNAME可能引发验证问题,建议替换为GitHub提供的内置变量${{ github.actor }}:
- name: Set package source run: dotnet nuget add source --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/REDACTED/index.json"
3. 验证包的推送目标与可见性
- 确认Library的NuGet包推送到了组织级Packages(而非仅Library仓库级),确保App仓库的
GITHUB_TOKEN能访问到该包; - 检查App项目中引用的包版本号,确保与已推送至GitHub Packages的版本完全一致。
4. 改用NuGet.config文件配置源(可选)
在App仓库根目录创建NuGet.config,将源配置和凭证整合在一起,简化工作流步骤:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="github" value="https://nuget.pkg.github.com/REDACTED/index.json" /> </packageSources> <packageSourceCredentials> <github> <add key="Username" value="${{ github.actor }}" /> <add key="ClearTextPassword" value="${{ secrets.GITHUB_TOKEN }}" /> </github> </packageSourceCredentials> </configuration>
之后工作流中只需直接执行dotnet restore,无需额外的源配置步骤。
内容的提问来源于stack exchange,提问作者Hugo Buff

