npm 混合公共仓库和私有仓库

Published at 16th February, 2016

需求

  1. 私有包托管在内部服务器中

  2. 项目中使用了公共仓库上的公共包,也使用了内部服务器上的私有包

  3. 希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库

解决

可以借助 npm 的 scoped package 功能,并配上 cnpmjs.org 搭建私有仓库,来解决上述需求。

  1. 使用 cnpmjs.org 在内部服务器上搭建一个私有仓库的服务(见官方教程,你只需进行前两步,即到启动服务器为止即可,后面不要跟着官方的来)

  2. 服务器 cnpmjs.org 中配置一个 scope,如 @swx

  3. 配置本地的 npm,使得对于该 scope 下的包请求内部服务器

    这可以和登录到私有仓库一块儿做:

    npm login --registry http://my_private_repo:1234 --scope=@swx
    

    以上命令行会登录到你刚才配置的 cnpmjs.org 内部服务器(如果没有用户则会创建),并且指定 @swx 下所有包都使用这个服务器处理

  4. 配置完毕

    现在所有 scope 是 @swx 的包在 publish 时候都会存储在你的内部服务器上,在 install 时候会从你服务器上下载,而其他包则照常。

    例如 npm install @swx/logger 会走内部服务器,npm install logger 则走公共仓库。

    注意,走内部服务器的包名字中包含 scope,即上例中的包 package.jsonname 字段是 "@swx/logger"。具体规则见 Scoped Packages

Troubleshooting

使用 cnpm 工具 (淘宝 npm 镜像) 时候没从我的内部服务器上下载,怎么解决?

cnpm 其实做了三件事:

  • 指定 npm 公共仓库是 registry.npm.taobao.org

  • 指定 npm 配置文件是 ~/.cnpmrc

  • 指定 npm 下载的包缓存在 ~/.cnpm/ 目录下

本文第三步中,登录并指定 scope 的时候,相关配置默认保存在了 ~/.npmrc 下,而使用 cnpm 时则没使用这个配置文件,因此失效。解决方法很简单,再登录一下,把配置保存进 ~/.cnpmrc 即可:

npm login --registry http://my_private_repo:1234 --scope=@swx --userconfig=$HOME/.cnpmrc

现在,cnpm install @swx/logger 会走内部服务器,cnpm install logger 则走淘宝的仓库。

仍然有问题?

请看我的命令行流程:http://pastebin.com/GYn074uz

Comments