隨着時間的推移,前端的工程日益龐大,越來越復雜的依賴包需要包管理器來維護。相比搭建沒有優勢bower倉儲,更好的方式是在局域網搭建NPM倉儲,維護項目中package.json中的各個插件的版本即可維護項目依賴。
sinopia是一個部署簡易的可以實現github倉儲私有化的npm組件。
注:本文sinopia的版本為1.4。
1 架構模式

如上圖:
客戶端產生npm請求后,發送到服務器(外網需要通過網關)。
用pm2啟動sinopia集群,可以自動負載均衡。當請求到sinopia后,他會先進行權限驗證(如果設置),通過驗證之后就在本地文件系統中尋找對應的npm包,如果不存在則向上游鏈接(uplinks)配置的地址發請求。
2 安裝部署
安裝較為簡單,本文檔所有的安裝都在root權限下進行。
2.1 安裝nodejs
node版本:node-v6.2.0-linux-x64.tar.gz
安裝過程略。
請注意,離線安裝時,壓縮包要在linux下解壓,否則npm無法使用。
2.2 安裝sinopia
node安裝成功並設置軟連接后,因為服務器在內網,所以先要設置npm代理。
//設置npm代理 npm config set proxy="http://name:password@proxy.domain.com:port" //設置淘寶國內鏡像 npm config set registry="https://registry.npm.taobao.org" --可以默認npmjs //安裝sionpia(不加后邊參數會在node-gyp編譯失敗) npm install sinopia --no-optional --no-shrinkwrap //將sionpia配置軟連接 ln -s /root/node_modules/sinopia/bin/sinopia /usr/local/bin/sinopia //測試啟動 sinopia
如果安裝成功,會出現以下log,則證明安裝成功。
Sinopia doesn't need superuser privileges. Don't run it under root.
warn --- config file - /root/.config/sinopia/config.yaml
warn --- http address - http://localhost:4873/
2.3 安裝pm2
//安裝pm2 npm install pm2 -g //配置軟連接 (安裝出現警告可能會需要) ln -s /root/node/node-v6.2.0-linux-x64/lib/node_modules/pm2/bin/pm2 /usr/local/bin/pm2 //測試是否安裝成功 pm2
如果安裝成功,則會出現pm2圖標及命令。
2.4 啟動sinopia
可以進程啟動或pm2啟動。
進程啟動: sinopia -l http://192.168.0.1:1234/
PM2啟動: pm2 start which sinopia
請注意,當用PM2啟動時,不要打錯單引號的全角半角。並且啟動的端口需要在配置文件中配置:
vi /root/.config/sinopia/config.yaml
在最后一行中加入:
listen: 192.168.0.1:1234
3 sinopia配置(config.yaml)
配置文件目錄:
-
config.yaml ------sinopia的配置文件
-
htpasswd ------存放用戶賬戶信息的文件,密碼通過sha1、base64加密
-
storage ------存放npm包及緩存包的文件夾
以上文件的目錄為(root用戶下):/root/.config/sinopia/
storage的存放地址可在config.yaml中配置:
storage: /root/.local/share/sinopia/storage
3.1 權限配置方式
我們的權限配置為:發布權限只有指定賬戶有,下載權限不需要登陸認證。
先在客戶端創建發布權限的賬戶(假設為test,用戶名不能有大寫),然后為該賬戶設置發布權限:
packages:
'*':
# allow all users (including non-authenticated users) to read and
# publish all packages
#
# you can specify usernames/groupnames (depending on your auth plugin)
# and three keywords: "$all", "$anonymous", "$authenticated"
access: $all
# allow all known users to publish packages
# (anyone can register by default, remember?)
publish: test
# if package is not available locally, proxy requests to 'npmjs' registry
proxy: npmjs
以上配置文件中 '*' 為包名的通配符,access為下載權限配置,publish為發布權限配置,proxy為上游地址name。在設置好發布賬號后,我們應該禁用npm的addUser功能,如下配置:
auth: htpasswd: file: ./htpasswd # Maximum amount of users allowed to register, defaults to "+inf". # You can set this to -1 to disable registration. max_users: -1
max_users為最大用戶數量,值為-1則無法通過addUser創建賬號。
3.2 日志收集
日志為文件存儲。
# log settings logs: - {type: stdout, format: pretty, level: http} - {type: file, path: sinopia.log, level: info}
3.3 上游鏈接
上游鏈接是當用戶請求的npm包,在本地倉儲中不存在的時候,請求的地址。配置如下:
# a list of other known repositories we can talk to
uplinks:
npmjs:
url: https://registry.npmjs.org/
請注意,雖然配置好了上游鏈接,但是因為我們的服務器在內網,所以需要為sinopia訪問上游鏈接時的請求配置代理:
http_proxy: http://name:password;@proxy.domain.com
https_proxy: http://name:password;@proxy.domain.com
no_proxy: localhost,127.0.0.1
4 使用說明
倉儲鏈接設置:
npm config set registry http://192.168.0.1:1234/
"http://host:port"為sinopia服務地址。建議使用nrm(nrm 是一個 NPM 源管理器)切換倉儲地址。
4.1 維護
維護需要用有發布權限的賬號,進行包的發布。發布包需要先登錄:
npm login
然后根據提示輸入:
Username: test
Password:
Email: (this IS public) test@domain.com
Logged in as test on http://192.168.0.1:1234/
顯示以上內容為登錄成功。登錄成功后,在包的文件夾中輸入以下命令即可發布:
npm publish
- abc@1.0.3
顯示 + name@version 即為發布成功,成功后也可瀏覽器進入http://192.168.0.1:1234/ 查看。
在項目中,我們要配置好package.json。
同時,我們的版本管理也需要更加嚴謹,維護好版本好的同時也要寫好更新說明,更新說明寫在組件的changelog.md中,這樣方便在瀏覽器瀏覽 http://192.168.0.1:1234/ 的時候查看。
版本號請遵循: semver 2.0 的語義化版本規則。