使用 cnpmjs 搭建企業私有 npm 倉庫

cnpmjs

cnpmjs 是企業私有 npm 服務的解決方案,在其 Github Wiki 中給出了若干快速搭建該倉庫並進行配置的方法。
這套筆記僅是筆者爲了解決安裝本身的 npm 庫 這一問題而使用的方案,對於企業內部緩存的內容不作解釋。
以前曾經嘗試過 sinopiagit+ssh 的方案,前者由於項目最後更新爲 2 年前,不敢用(並且你是 build failing 好嗎),後者在 @Azard 的使用中發現會遇到 npm 調用 git 的權限問題,十分難以解決。node

服務端部署

部署主要分爲如下兩種:快速部署以及從源碼部署mysql

cnpmjs 支持 MySQL,Postgres,SQLite,Mariadb 這一系列的關係型數據庫。在快速部署當中,僅須要準備 node.js 環境。cnpmjs 會使用默認的 sqlite 數據庫存儲信息並啓動。git

$ nohup cnpmjs.org start --admins='myname,othername'  --scopes='@my-company-name,@other-name' &

這種依靠一條命令進行配置的方法輕便但不利於維護。尤爲會在下面提到的經過修改 config 文件的內容,在此命令運行下 cnpmjs 不適用github

從源碼部署當中說起了編輯本身的配置文件 config/config.js請不要修改原有的 config/index.js
在服務啓動以後,於 ~/.cnpmjs.org/下會有 logs文件夾出現,能夠進入查看服務器啓動狀態,同時能夠建立 ~/.cnpmjs.org/config.js,其效果等同於上面本身的配置文件,會覆蓋默認配置。web

須要修改的配置主要有:(參考自 CNPM 配置指南【實戰填坑】sql

$ sudo vi $HOME/.cnpmjs.org/config.json
{
  "database": {
    "db":"cnpmjs", 
    "dialect":"mysql",
    "host": "localhost",
    "port": 3306,
    "username": "root",
    "password": "yourpassword",
    "pool": {
      "maxConnections": 10,
      "minConnections": 0,
      "maxIdleTime": 30000
    }
  },
  "enablePrivate": true, 
  "syncModel": "none",
  "bindingHost":"0.0.0.0", 
  "admins": {
    "sanzhi": "i@sanzhi.me", 
  },
  "scopes": ["@company"], 
  "registryHost":"npm.sanzhi.me", 
  "alwaysAuth":false
}

部署過程當中可能出現的問題:數據庫

  • 從 npm 包快速部署會犧牲配置可變性
  • 數據庫請預先配置好,建議 MySQL,在項目地址上找不到多少用 SQLite 的。
  • bindingHost admins registryHost scopes 都是重要的配置項,其中npm

    • bindingHost 默認在127.0.0.1 不配置沒法遠程訪問
    • admins 決定了能夠發包的用戶(接下來會提到)
    • scopes 是企業內部包的名稱,聽說不能發不帶scopes的包(未驗證)
    • registryHost 是以後用戶下載包內容的地址。十分重要。默認爲 cnpmjs 官方。若是沒有域名,請填寫 xxx.xxx.xxx.xxx:7001 的格式

部署成功以能夠訪問 7002 端口的 web 頁面爲判別條件。json

發包

發包在進入你須要發的項目文件夾後就兩個命令。
一個是要確保你在私有倉庫的登陸狀態,經過 npm set registry http://xxx.xxx.xxx.xxx:7001 預先設置 npm 的註冊地址爲你的私有倉庫。http://不能忘了,不然就會發現登陸的時候卡在那裏,過了一分多鐘纔有反應。登陸使用 npm addusernpm login 都可。以後會輸入以下信息緩存

Username:sanzhi
Password:********
E-Mail(This is public):i@sanzhi.me

第一次登陸視同註冊,以後你就處於私有倉庫的登陸狀態,可使用 npm publish 發包。發好了以後去私有倉庫的 web 頁面就能夠搜到,默認 web 頁面在 7002 端口

客戶端調用

在確認 registry 被設置好後,使用 npm install @company/packagename 進行拉取。若是服務器沒有另外設定包的訪問權限,則無需登陸。
在這個過程當中,npm 會先訪問 http://xxx.xxx.xxx.xxx/7001/@company/packagename 獲取 json 信息,在該信息裏的 version.xxx.dist.tarball 中存着某個版本的下載地址。這個地址的前綴即上面的 registryHost

總結

cnpmjs 是以面向業界爲主流的開源框架,其配置文檔(即 wiki )很是具備功利性而缺乏詳細的配置項解說,這與其強大多樣的功能不對等,且過期或存在少量問題的文檔居多,在複製粘貼配置的過程當中務必當心而不要貪圖 5 分鐘快速配置。關於 scope 的選項還沒有驗證是否能夠將該選項去掉。

相關文章
相關標籤/搜索