pnpm publish 时怎么指定 registry?

令狐筱萌 阅读 4

我用 pnpm 开发了一个组件库,想发布到公司私有 npm 仓库,但执行 pnpm publish 总是默认推送到官方 registry,试过加 –registry 参数好像没生效,是不是 pnpm 的用法不一样?

我的 .npmrc 里已经配了 registry,但 publish 还是走的公网,有没有人遇到过类似问题?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
 ___建英
这问题我之前踩过坑,pnpm 和 npm 在 publish 这块行为确实不太一样。

先说最直接的解决方案,在 package.json 里加 publishConfig

{
"publishConfig": {
"registry": "https://your-private-registry.com/"
}
}


这个优先级最高,比命令行参数和 .npmrc 都管用,推荐用这个方式。

你说的 --registry 参数没生效,大概率是写法问题。正确写法是:

pnpm publish --registry=https://your-private-registry.com/


注意等号中间不能有空格,有空格的话参数就丢了。

再说 .npmrc 的问题,很多人配的是全局 registry,这个只对 install 生效。publish 的时候 pnpm 会查好几个地方的配置,优先级是 package.json 的 publishConfig > 命令行参数 > 项目级 .npmrc > 用户级 .npmrc。

如果你的包是 scoped package,比如 @company/my-lib,可以在 .npmrc 里针对 scope 单独配:

@company:registry=https://your-private-registry.com/


这样 install 和 publish 都会走私有仓库。

还有个坑,如果你之前登录过 npm 官方仓库,本地可能存了官方的 token,publish 的时候可能会用错身份认证。可以跑一下 pnpm whoami 看看当前登录的是哪个 registry,不对的话就用 pnpm logout 退掉重新登录私有仓库。

建议直接用 publishConfig,一劳永逸,省得每次发版都提心吊胆。
点赞
2026-03-02 15:24
UP主~淑丽
问题应该出在 pnpm 对于安装和发布使用的 registry 是分开管理的。.npmrc 里配的 registry 默认只管安装依赖,发布时需要单独指定。

最靠谱的方式是在 package.json 里加 publishConfig,这样最明确:

{
"name": "your-component-lib",
"version": "1.0.0",
"publishConfig": {
"registry": "https://your-company-registry.com/"
}
}


加了这个之后 pnpm publish 就会乖乖往你指定的私有仓库推了。

如果非要用命令行参数,语法是这样的:

pnpm publish --registry=https://your-company-registry.com/


注意等号两边不能有空格,我之前也踩过这个坑,写了空格参数就失效了。

还有个容易忽略的点,如果你的包是 scoped package(比如 @company/xxx),需要在 .npmrc 里单独配置 scope 对应的 registry:

@company:registry=https://your-company-registry.com/


另外排查的时候可以加 --dry-run 参数先看下发布配置对不对,不会真的推上去:

pnpm publish --dry-run


这样能看到具体会往哪个 registry 发请求,省得每次都真发布来调试。
点赞 1
2026-03-01 12:04