使用环境变量替代.npmrc中的PAT时GitHub Actions认证失败
解决GitHub Actions发布GitHub Packages时401认证失败的问题
问题根源
你提交到仓库的.npmrc里写的${GITHUB_TOKEN}是无效的——npm不会自动把这个占位符替换成环境变量里的真实token,导致认证时拿不到有效凭据,自然报401。
具体解决步骤
1. 修正仓库里的.npmrc
把涉及GitHub Packages认证的行删掉,只保留公共npm源的配置,避免提交无效或敏感内容:
registry=https://registry.npmjs.com always-auth=true
2. 修改GitHub Actions工作流
在工作流里动态生成GitHub Packages的认证配置,不要依赖提交的.npmrc:
name: component_4 publish on: push: branches: - main jobs: publish-gpr: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 16 registry-url: 'https://registry.npmjs.com' always-auth: true # 动态追加GitHub Packages的配置到.npmrc - run: | echo "@my-org:registry=https://npm.pkg.github.com" >> .npmrc echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc - run: npm ci - run: npx semantic-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 如果要同时发布到npm官方仓库,需要添加NPM_TOKEN密钥并传入 # NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
3. 检查工作流权限(如果还是失败)
如果调整后仍然报401,去仓库的「Settings」→「Actions」→「General」里,找到「Workflow permissions」,确保选了「Read and write permissions」,保存后重新跑工作流。
更简洁的替代写法
如果你的包只发布到GitHub Packages,可以直接用actions/setup-node的参数配置,不用手动写.npmrc:
- uses: actions/setup-node@v3 with: node-version: 16 registry-url: 'https://npm.pkg.github.com' always-auth: true env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
这种写法会让setup-node自动生成带正确认证的.npmrc,省掉手动追加的步骤。
内容的提问来源于stack exchange,提问作者Mani Shankar
相关产品推荐
相关产品推荐

