如何将自定义包加入GitHub Workflow?解决.NET Core工作流包找不到问题
解决GitHub Actions中.NET Core项目找不到自定义GitHub包的问题
别担心,仅仅在csproj里添加包引用确实不够——因为GitHub Packages默认需要授权访问,而且工作流环境里并不会自动识别你的私有包源。我之前也踩过这个坑,下面给你一步步讲清楚该怎么操作:
一、先搞定访问权限
首先得确保你的GitHub Actions有读取自定义包的权限:
- 如果你的自定义包和WebAPI仓库同属一个GitHub账号/组织,那直接用工作流自带的
GITHUB_TOKEN就行,它默认带有read:packages权限,但要确认包仓库的设置里允许同组织的Actions访问(一般默认是开启状态)。 - 如果包在另一个账号/私有仓库里,那得创建一个Personal Access Token (PAT):在GitHub账号的
Settings → Developer settings → Personal access tokens里生成,勾选read:packages权限,然后把这个PAT添加到WebAPI仓库的Secrets里(比如命名为PACKAGE_READ_TOKEN)。
二、在工作流中配置包源和认证
接下来要在工作流的Install Dependencies步骤前,添加一个步骤来配置NuGet源指向GitHub Packages,同时注入认证信息:
方法1:直接在工作流中用命令添加源
在你的工作流yaml里,加入这一步:
- name: Add GitHub Packages NuGet Source run: | # 如果用GITHUB_TOKEN(同组织/账号场景) dotnet nuget add source --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/你的GitHub用户名或组织名/index.json" # 如果用自定义PAT(跨组织/私有包场景),替换成下面的命令 # dotnet nuget add source --username ${{ github.actor }} --password ${{ secrets.PACKAGE_READ_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/你的GitHub用户名或组织名/index.json"
这里的--store-password-in-clear-text是因为GitHub Actions的环境里没有安全存储密码的机制,不用担心泄露——密码要么是临时的GITHUB_TOKEN,要么是存在Secrets里的加密内容。
方法2:用NuGet.config文件管理源
如果你习惯用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/你的GitHub用户名或组织名/index.json" /> </packageSources> <packageSourceCredentials> <github> <add key="Username" value="你的GitHub用户名" /> <add key="ClearTextPassword" value="%PACKAGE_TOKEN%" /> </github> </packageSourceCredentials> </configuration>
然后在工作流里,执行dotnet restore前,先把Secrets里的token注入到环境变量:
- name: Set Package Token Env Var run: echo "PACKAGE_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV # 用PAT的话就改成 secrets.PACKAGE_READ_TOKEN
三、确认csproj里的引用没问题
虽然你已经加了引用,但再检查一下:包的ID要和GitHub Packages里显示的完全一致,版本号也要精确匹配(比如1.0.0),示例如下:
<PackageReference Include="你的自定义包ID" Version="1.0.0" />
完整的工作流示例
给你一个整合好的参考模板:
name: .NET Core WebAPI CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: dotnet-version: '8.x' # 替换成你的.NET版本 - name: Add GitHub Packages NuGet 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/你的组织名/index.json" - name: Install Dependencies run: dotnet restore YourWebAPI.csproj # 替换成你的项目路径 - name: Build run: dotnet build --configuration Release --no-restore - name: Run Tests run: dotnet test --configuration Release --no-restore --verbosity normal
额外注意点
- 如果你用的是组织账号,包源URL里要写组织名,而不是个人用户名。
- 绝对不要把token明文写在任何文件里,一定要用GitHub Secrets来管理敏感信息。
- 如果还是找不到包,先检查包是否真的成功推送到GitHub Packages了,版本号有没有输入错误。
内容的提问来源于stack exchange,提问作者radulfr
相关产品推荐
相关产品推荐

