cnpm 是企業內部搭建 npm 鏡像和私有 npm 倉庫的開源方案,當企業業務邏輯相關的模塊可能不適合開源。這部分私有的模塊就能夠放在私有 npm 倉庫中來管理和維護。 如下爲搭建私有 npm 的詳細步驟,這裏使用了由阿里的團隊開源的 [cnpmjs.org][href1] ,主要分爲 Server 端的配置和 Client 的配置:
Server 端主要有 cnpm, mysql, nginx 的配置。javascript
# system $ cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) # node $ node -v v6.9.1 # npm $ npm -v 3.10.9 # nginx $ nginx -v nginx version: nginx/1.9.9 # mysql $ mysql -u yourname -p $ mysql> \s; Server version: 5.5.38-log MySQL Community Server (GPL) # server ip 192.168.33.10
# clone from github $ git clone git://github.com/cnpm/cnpmjs.org.git $HOME/cnpmjs.org $ cd $HOME/cnpmjs.org # init mysql $ mysql -u yourname -p mysql> create database cnpmjs; mysql> use cnpmjs; mysql> source docs/db.sql
$ pwd /home/xxx/cnpmjs.org $ vim config/config.js
module.exports = { debug: false, // 添加本身的私有前綴,能夠有多個,必填 scopes: ['@test'], enableCluster: true, // mysql,必填 database: { db: 'cnpmjs', username: 'username', password: 'password', dialect: 'mysql', host: '192.168.33.10', port: 3306, pool: { maxConnections: 10, minConnections: 0, maxIdleTime: 30000 }, logging: !!process.env.SQL_DEBUG, }, mail: { enable: false, appname: 'appname', from: 'from', service: 'service', auth: { user: 'user', pass: 'pass' } }, // 日誌目錄,cnpm 的運行日誌,必填 logdir: '/data/logs/cnpm/node_logs/', nfs: require('fs-cnpm')({ // package 存放目錄,必填 dir: '/data/logs/cnpm/node_nfs/', }), // 上傳目錄,必填 uploadDir: '/data/logs/cnpm/node_modules/', enablePrivate: true, // 註冊域名,必填 registryHost: 'registry.cnpm.xx.com', // 能夠 publish package 的用戶,必填 admins: { admin: 'admin' }, // 同步官方包的模式,必填 syncModel: 'exist', // 'none', 'all', 'exist' // package 的大小 jsonLimit: 1073741824, // 不在 cnpm 管理的有私有前綴的 package 的白名單 privatePackages: ['@remobild/react-native-toast'] }; $ vim config/index.js # 註釋掉 bindingHost,對外網開放,不然只能本機提交 bindingHost: '' # 注意 syncModel 不建議寫 all, all 模式下會同步整個官方倉庫,須要很大的存儲空間 # 確保 logdir, nfsdir, uploadDir 目錄權限可寫 # package 的大小,看本身的包狀況,若是有特別大的 package,而且經過 nginx 代理了,那麼除了 jsonLimit 外,nginx 的 client_max_body_size 也要修改
$ npm install --build-from-source --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node
# debug 模式 $ npm run dev # 後臺啓動 $ npm start # 檢查 registry $ curl http://192.168.33.10:7001 # 檢查 web $ curl http://192.168.33.10:7002 # 以上的兩個端口也能夠經過 config.js 修改,默認的 7001 和 7002 寫在 config/index.js 中
upstream cnpm { server 127.0.0.1:7002; } server { listen 80; server_name cnpm.xx.com; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://cnpm/; proxy_redirect off; } }
upstream registry_cnpm { server 127.0.0.1:7001; } server { listen 80; server_name registry.cnpm.xx.com; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://registry_cnpm/; proxy_redirect off; } }
至此,Server 端的配置就完成了,在本地綁定 host 訪問 cnpm.xx.com 就能夠看見本身的 npm 倉庫了。java
Client 端主要是配置命令行工具完成註冊,登陸等步驟後,就能夠發佈 package 到本身的 npm 倉庫中了。node
# cnpm 官方有本身的 cnpm 命令,可是在咱們的實際使用過程當中,發生過一些問題,以後採用了給 npm 官方命令添加別名的方式 $ echo -e '\n#alias for cnpm\nalias cnpm="npm --registry=http://registry.cnpm.xx.com --cache=$HOME/.npm/.cache/cnpm --disturl=http://xx.com --userconfig=$HOME/.cnpmrc"' >> ~/.bashrc && source ~/.bashrc
1. 配置 cnpmrc $ vim ~/.cnpmrc registry=http://registry.cnpm.xx.com 2. 註冊 (註冊前須要把要註冊的人的郵箱前綴發給管理員, 管理員在上邊的 config.js 中添加完畢以後才能夠) $ cnpm adduser 依次輸入用戶,密碼,郵箱 3. 登陸 $ cnpm login 沒有錯誤表示登陸成功
# publish package $ mkdir test && cd test $ cnpm init -y $ touch test.js $ cnpm publish # install package $ cnpm install @test/test --save
以上是 Client 端的配置過程,仍是很簡單的。mysql
經過上邊的 Server 端和 Client 端的配置,咱們就能夠在本身公司內發佈一些不便公開的 package 到本身的 npm 倉庫中。另外,cnpm 也是能夠安裝官方倉庫的 package 的,安裝過程當中 cnpm 會到本身的倉庫中尋找要安裝的 package , 找不到的狀況下會默認到 https://npm.taobao.org 尋找,這是阿里團隊維護的一個完整 https://www.npmjs.com 鏡像,同步頻率目前爲10分鐘一次,以保證儘可能與官方服務同步。react