1. 程式人生 > >私有 npm 倉庫的搭建

私有 npm 倉庫的搭建


cnpm 是企業內部搭建 npm 映象和私有 npm 倉庫的開源方案,當企業業務邏輯相關的模組可能不適合開源。這部分私有的模組就可以放在私有 npm 倉庫中來管理和維護。

以下為搭建私有 npm 的詳細步驟,這裡使用了由阿里的團隊開源的 [cnpmjs.org][href1] ,主要分為 Server 端的配置和 Client 的配置:

Server

Server 端主要有 cnpm, mysql, nginx 的配置。

環境:

```# 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


<h3>安裝:</h3>
```# 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&gt; create database cnpmjs;
mysql&gt; use cnpmjs;
mysql&gt; 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 也要修改


<h3>安裝依賴:</h3>
```$  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 中


<h3>nginx: (<em>這一步非必須,後邊 client 直接用 ip 也可以</em>)</h3>
<h4>cnpm.xx.com</h4>
```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;
    }
}

registry.cnpm.xx.com

```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;
}

}


<p>至此,Server 端的配置就完成了,在本地繫結 host 訪問 cnpm.xx.com 就可以看見自己的 npm 倉庫了。</p>
<h2>Client</h2>
<p>Client 端主要是配置命令列工具完成註冊,登入等步驟後,就可以釋出 package 到自己的 npm 倉庫中了。</p>
<h3>安裝 cnpm:</h3>
```# 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"' &gt;&gt; ~/.bashrc &amp;&amp; source ~/.bashrc

配置:

```1. 配置 cnpmrc $ vim ~/.cnpmrc registry=http://registry.cnpm.xx.com
  1. 註冊
    (註冊前需要把要註冊的人的郵箱字首發給管理員, 管理員在上邊的 config.js 中新增完畢之後才可以)
    $ cnpm adduser
    依次輸入使用者,密碼,郵箱

  2. 登入
    $ cnpm login
    沒有錯誤表示登入成功


<h3>使用:</h3>
```# publish package
$ mkdir test &amp;&amp; cd test
$ cnpm init -y
$ touch test.js
$ cnpm publish

# install package
$ cnpm install @test/test --save

以上是 Client 端的配置過程,還是很簡單的。

通過上邊的 Server 端和 Client 端的配置,我們就可以在自己公司內釋出一些不便公開的 package 到自己的 npm 倉庫中。另外,cnpm 也是可以安裝官方倉庫的 package 的,安裝過程中 cnpm 會到自己的倉庫中尋找要安裝的 package , 找不到的情況下會預設到 https://npm.taobao.org 尋找,這是阿里團隊維護的一個完整 https://www.npmjs.com 映象,同步頻率目前為10分鐘一次,以保證儘量與官方服務同步。

來源:https://segmentfault.com/a/1190000016705302