npm私服

鏡像或是代理,這是一個(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 installnpm publishyarn installyarn 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

參考文檔

附注: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即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容