鏡像或是代理,這是一個(gè)問題。
需求&選項(xiàng)
多個(gè)nodejs項(xiàng)目間的公共代碼,但又不太適合發(fā)到npmjs.org。
- 個(gè)人多項(xiàng)目公用
- 團(tuán)隊(duì)多項(xiàng)目公用
部分可選方式:
-
npm link:只適合本機(jī)上的代碼共用,簡單粗暴 -
verdaccio:可實(shí)現(xiàn)團(tuán)隊(duì)間共享,輕量級(jí)方案 -
nexus:團(tuán)隊(duì)級(jí)共享的重量級(jí)方案
最終選擇nexus,因?yàn)樗蠖ㄊ紫人且粋€(gè)maven私服),而且我不喜歡npm link。盡管verdaccio試過后也挺好(簡單的配置放在本文最后)。
安裝配置nexus
以下步驟在安裝nexus的服務(wù)器進(jìn)行。
安裝
Docker方式是最方便的,其它方式請(qǐng)自行官網(wǎng)查閱。
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
因?yàn)楸娝苤脑?,docker鏡像的拉取可能會(huì)出問題,多試幾次或者找個(gè)可用的mirror。
啟動(dòng)后,訪問http://<your host>:8081/,登錄nexus。
用戶名:admin,初始密碼在/data/nexus/admin.password文件中,首次登錄需要修改。
配置
新增兩個(gè)倉庫:
- 名稱為
npm-registry,類型為proxy,用于緩存公用倉庫。當(dāng)然,你可以把Remote Storage設(shè)置為國內(nèi)鏡像,比如https://registry.npm.taobao.org/; - 名稱為
npm-private,類型為hosted,用于發(fā)布內(nèi)部代碼;
定義倉庫組:
-
npm-group,類型為group,這樣私有倉庫和代理倉庫都可以共享相同的URL(后面會(huì)說到)。
如果內(nèi)部代碼的發(fā)布涉及到對(duì)一些公用倉庫做修改(但不修改組織名),切記在Members列表中,將npm-private排在npm-registry之前/上。
開啟npm token支持:在Realms功能中,啟用npm Bearer Token Realm。
私服配置完畢。
安裝配置npm
以下步驟,在使用nexus私服的開發(fā)環(huán)境操作。npm使用私服,可以是全局方式或每項(xiàng)目方式,這里只考慮最省事的全局方式。
配置
設(shè)置全局npm私服:
npm set registry http://<your host>:8081/repository/npm-group/
設(shè)置npm私服為永久登錄:
npm login --registry=http://<your host>:8081/repository/npm-group/ --always-auth
設(shè)置npm私服(內(nèi)部發(fā)布用)為永久登錄:
npm login --registry=http://<your host>:8081/repository/npm-private/ --always-auth
補(bǔ)充設(shè)置,保證yarn能使用npm配置:
npm config set always-auth true
以上設(shè)置后,可打開~/.npmrc文件驗(yàn)證,內(nèi)容大致如下:
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>
現(xiàn)在可以執(zhí)行npm install或npm publish或yarn install或yarn publish了。
常見問題
- 401
- 檢查是否未啟用npm Bearer Token Realm
- 刪除
~/.npmrc,重新執(zhí)行npm login
-
找不到修改版的公共包
- 檢查是不是private和proxy的順序不正確
-
相同版本的包沒法publish
- 不建議重用相同版本號(hào),如果不想像chrome一樣瘋狂升版本,可以使用prerelease方式
- yarn:
yarn version --prerelease --preid=alpha - npm:
npm version prerelease --preid=alpha
- yarn:
- 不建議重用相同版本號(hào),如果不想像chrome一樣瘋狂升版本,可以使用prerelease方式
參考文檔
附注:verdaccio
盡管verdaccio是一個(gè)完備的private registry解決方案,但個(gè)人建議還是把配置文件放在公共庫的源代碼管理下。
啟動(dòng)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
發(fā)布及獲取包,命令加上--registry=http://localhost:4873即可。