同一GitHub组织下仓库A如何访问仓库B的NuGet包?
问题描述
我在GitHub同一组织下拥有两个私有仓库repo A和repo B,已向repo A发布两个NuGet包,向repo B发布一个NuGet包。repo A可以正常安装自身的包,但无法访问repo B的包,执行dotnet build时出现以下错误:
error NU1101: Unable to find package {{PackageId}}. No packages exist with this id in source(s): github. PackageSourceMapping is enabled, the following source(s) were not considered: /usr/local/share/dotnet/library-packs, nuget.org.
我的nuget.config文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" /> <add key="github" value="https://nuget.pkg.github.com/{{orgname}}/index.json" /> </packageSources> <packageSourceCredentials> <github> <add key="Username" value="{{USERNAME}}" /> <add key="ClearTextPassword" value="{{TOKEN}}" /> </github> </packageSourceCredentials> <packageSourceMapping> <packageSource key="github"> <package pattern="{{OrgName}}.*" /> </packageSource> <packageSource key="nuget.org"> <package pattern="*" /> </packageSource> </packageSourceMapping> </configuration>
我的PAT拥有repo和write:packages权限且无过期时间,将包可见性改为internal也无法解决问题,请问如何让repo A访问repo B中的NuGet包?
解决方案
1. 检查包ID匹配规则
确认repo B中发布的NuGet包ID严格以组织名称开头(注意大小写敏感)。当前包源映射使用{{OrgName}}.*的通配符,如果包ID前缀与组织名不一致,NuGet会跳过从github源查找该包。
2. 验证PAT对repo B的访问权限
虽然PAT拥有repo权限,仍需确认其授权范围包含repo B:
- 替换占位符后,用该PAT访问包的下载链接:
https://nuget.pkg.github.com/{{orgname}}/download/{{PackageId}}/{{version}}/{{PackageId}}.nupkg,能下载则权限正常,否则需检查PAT的仓库访问范围是否覆盖repo B。
3. 配置包的仓库访问权限
在GitHub组织的包管理界面,找到repo B发布的包,进入"Access control"设置,将repo A添加到允许访问的仓库列表中。即使包可见性设为internal,也需要明确授权目标仓库访问。
4. 清除NuGet缓存
执行以下命令清除本地缓存,避免缓存导致的查找异常:
dotnet nuget locals all --clear
之后重新运行dotnet restore或dotnet build。
5. 排查包源映射配置
暂时注释掉packageSourceMapping节点的内容,执行dotnet build测试。如果此时能找到包,说明问题出在映射规则上,需调整pattern确保覆盖repo B的包ID(比如改为更宽松的*{{OrgName}}*,或直接指定具体包ID)。
6. 检查NuGet版本
确保使用的NuGet版本为6.0及以上(包源映射功能需要该版本支持),执行dotnet nuget --version查看版本,必要时升级.NET SDK。
内容的提问来源于stack exchange,提问作者user246392

