私有 npm 倉庫的搭建

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

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

Server

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 中

nginx: (這一步非必須,後邊 client 直接用 ip 也能夠)

cnpm.xx.com

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

至此,Server 端的配置就完成了,在本地綁定 host 訪問 cnpm.xx.com 就能夠看見本身的 npm 倉庫了。java

Client

Client 端主要是配置命令行工具完成註冊,登陸等步驟後,就能夠發佈 package 到本身的 npm 倉庫中了。node

安裝 cnpm:

# 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

相關文章
相關標籤/搜索