发布npm包到GitHub Package Registry时报E401认证失败如何解决?
报错原因
- 核心原因:你使用
sudo执行npm命令。sudo会切换到root用户上下文,actions/setup-node为当前runner用户配置的npm认证信息、以及你传入的NODE_AUTH_TOKEN环境变量不会被root用户继承,导致npm请求GitHub Registry时没有携带认证token,触发401错误。 - 次要潜在问题:
- package.json的repository字段格式错误,
git://github.com/@company-name/repository-name.git中的组织名前多了@符号,虽然不是直接触发401的原因,但会导致后续发布校验不通过。 - 版本号带
v前缀不符合npm版本号规范,可能引发版本匹配异常。 - 工作目录切换到
.generated/后,该目录下没有对应的.npmrc配置,也可能导致registry识别异常。 - GITHUB_TOKEN默认权限不足,没有写入包的权限。
- package.json的repository字段格式错误,
修复方案
- 首先去掉npm命令前的
sudo,GitHub Action的默认runner账户拥有足够权限执行npm操作,无需额外提权:
- name: Install and publish working-directory: .generated/ run: | npm install npm publish env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- 修正package.json的配置项:
{ "name": "@company-name/repository-name", "version": "1.7.0", "repository": "git://github.com/company-name/repository-name.git" }
- 若
.generated/目录下没有.npmrc配置,可在执行命令前手动写入:
run: | echo "@company-name:registry=https://npm.pkg.github.com" > .npmrc npm install npm publish
- 进入仓库的
Settings > Actions > General > Workflow permissions页面,确认GITHUB_TOKEN的权限设置为「Read and write permissions」,确保拥有包的写入权限。
内容的提问来源于stack exchange,提问作者Stefan Falk
相关产品推荐
相关产品推荐

