npm publish 报 403 Forbidden PUT @acme/utils,同一个 token 在另一个仓库能发,这个仓库不行。registry 是公司自建的 Nexus。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

npm whoami --registry=https://npm.acme.internal
npm publish --registry=https://npm.acme.internal
npm token list

token 绑定了用户和仓库路径权限,跨 scope 或跨仓库时没有写权限就返回 403。CI 里用的是只读的部署 token,能装不能发。这一点先确认清楚,后面就不用反复试。

「私有包发布 403」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

具体做法是,用 npm whoami 确认当前 token 对应的账号;在 registry 后台看该账号对 @acme scope 的权限;给 CI 单独建一个有发布权限的 token 只注入发布任务;本地发布用 npmrc 里的独立凭据 不要共用。

改完照着核一遍,whoami 返回有发布权限的账号 发布成功且 registry 上能看到新版本。

作者 9823189