镜像或是代理,这是一个问题。
需求&选项
多个nodejs项目间的公共代码,但又不太适合发到npmjs.org。
- 个人多项目公用
- 团队多项目公用
部分可选方式:
-
npm link
:只适合本机上的代码共用,简单粗暴 -
verdaccio
:可实现团队间共享,轻量级方案 -
nexus
:团队级共享的重量级方案
最终选择nexus,因为它大而全(首先它是一个maven私服),而且我不喜欢npm link。尽管verdaccio试过后也挺好(简单的配置放在本文最后)。
安装配置nexus
以下步骤在安装nexus的服务器进行。
安装
Docker方式是最方便的,其它方式请自行官网查阅。
mkdir -p /data/nexus && chown -R 200 /data/nexus
docker run -d -p 8081:8081 -p 8082:8082 -p 8083:8083 --name nexus -v /data/nexus:/nexus-data sonatype/nexus3
因为众所周知的原因,docker镜像的拉取可能会出问题,多试几次或者找个可用的mirror。
启动后,访问http://<your host>:8081/
,登录nexus。
用户名:admin
,初始密码在/data/nexus/admin.password
文件中,首次登录需要修改。
配置
新增两个仓库:
- 名称为
npm-registry
,类型为proxy
,用于缓存公用仓库。当然,你可以把Remote Storage设置为国内镜像,比如https://registry.npm.taobao.org/
; - 名称为
npm-private
,类型为hosted
,用于发布内部代码;
定义仓库组:
-
npm-group
,类型为group
,这样私有仓库和代理仓库都可以共享相同的URL(后面会说到)。
如果内部代码的发布涉及到对一些公用仓库做修改(但不修改组织名),切记在Members列表中,将npm-private
排在npm-registry
之前/上。
开启npm token支持:在Realms功能中,启用npm Bearer Token Realm。
私服配置完毕。
安装配置npm
以下步骤,在使用nexus私服的开发环境操作。npm使用私服,可以是全局方式或每项目方式,这里只考虑最省事的全局方式。
配置
设置全局npm私服:
npm set registry http://<your host>:8081/repository/npm-group/
设置npm私服为永久登录:
npm login --registry=http://<your host>:8081/repository/npm-group/ --always-auth
设置npm私服(内部发布用)为永久登录:
npm login --registry=http://<your host>:8081/repository/npm-private/ --always-auth
补充设置,保证yarn能使用npm配置:
npm config set always-auth true
以上设置后,可打开~/.npmrc
文件验证,内容大致如下:
registry=http://<your host>:8081/repository/npm-group/
always-auth=true
//<your host>:8081/repository/npm-group/:_authToken=<your token>
//<your host>:8081/repository/npm-private/:_authToken=<your token>
现在可以执行npm install
或npm publish
或yarn install
或yarn publish
了。
常见问题
- 401
- 检查是否未启用npm Bearer Token Realm
- 删除
~/.npmrc
,重新执行npm login
-
找不到修改版的公共包
- 检查是不是private和proxy的顺序不正确
-
相同版本的包没法publish
- 不建议重用相同版本号,如果不想像chrome一样疯狂升版本,可以使用prerelease方式
- yarn:
yarn version --prerelease --preid=alpha
- npm:
npm version prerelease --preid=alpha
- yarn:
- 不建议重用相同版本号,如果不想像chrome一样疯狂升版本,可以使用prerelease方式
参考文档
附注:verdaccio
尽管verdaccio是一个完备的private registry解决方案,但个人建议还是把配置文件放在公共库的源代码管理下。
启动verdaccio:
verdaccio --config ./verdaccio.yml
verdaccio.yml:
storage: ./.verdaccio/storage
plugins: ./.verdaccio/plugins
web:
title: Verdaccio
auth:
htpasswd:
file: ./.verdaccio/htpasswd
uplinks:
npmjs:
url: https://registry.npmjs.org/
maxage: 30m
taobao:
url: https://registry.npm.taobao.org/
cnpm:
url: https://r.cnpmjs.org/
nj:
url: https://registry.nodejitsu.com/
rednpm:
url: https://registry.mirror.cqupt.edu.cn/
npmMirror:
url: https://skimdb.npmjs.com/registry/
deunpm:
url: http://registry.enpmjs.org/
packages:
'@<your org>/*':
access: $all
publish: $all
unpublish: $all
'@*/*':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: taobao
'**':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: taobao
server:
keepAliveTimeout: 60
middlewares:
audit:
enabled: true
# log settings
logs:
- { type: stdout, format: pretty, level: http }
publish:
allow_offline: true
listen:
- 0.0.0.0:4873
max_body_size: 100mb
发布及获取包,命令加上--registry=http://localhost:4873
即可。