1. 程式人生 > >構建前端團隊的私有npm倉庫

構建前端團隊的私有npm倉庫

有一點規模的團隊,都需要逐漸構建自己的npm包。現在有一個比較好的解決方案Sinopia,可以快速搭建和部署私有的npm伺服器。

本文詳細記錄了我在搭建私有npm包時,遇到的問題,以及個人的思考。

1. 安裝Sinopia

安裝

首先,你要自己配置nodejs及npm的環境,然後執行

npm install -g sinopia

啟動

$ sinopia
 warn  --- config file  - .....\AppData\Roaming\sinopia\config.yaml
 warn  --- http address - http://localhost:4873/

連線中的文件已經寫的很詳細了,我就不重複造輪子了。

深坑預警

後來我們把私有倉庫改為了verdaccio,因為sinoipa不支援包名稱空間,詳情請見下文。

3、搭建好私有npm倉庫後遇到什麼坑?

我發現使用nrm切換到私有npm倉庫對應的源後,下載帶@ 符號的包都下載失敗,比如下載 @angular/core,就會下載失敗,這是為什麼呢,查閱了一些資料,發現這其實是Sinopia自己的bug,bug產生的原因就是:sinopia在代理到npmjs.org公有庫時將@符號轉碼為%40,致使在公有庫中找不到對應的包,返回404 ,簡單點說就是 @angular/core 代理請求的時候被轉換成了 %40angular/core,所以我們需要在代理請求發出之前將其轉回 @angular/core

4、如何解決?

修改sinopia原始碼:修改位於sinopia/lib/up-storage.js檔案第10行:將var encode = encodeURIComponen;,更改為:var encode = function(thing) {return encodeURIComponent(thing).replace(/^%40/, ‘@’);}; ,這段程式碼的含義就是將%40轉回@,於是就解決了不能下載帶有@符號的npm包的bug

5、更好的解決方案?

由於sinopia的作者已於二年前停止對sinopia的維護和升級,所以出來了一個sinopia的fork,名字叫做Verdaccio,然後由Verdaccio繼續對sinopia進行更新和維護,具體如何使用Verdaccio來構建私有npm伺服器,請見Verdaccio的github介紹

參考文件

2. 構建過程中遇到的問題:

2.1. 外網無法訪問私有sinopia伺服器

[root@webteam sysconfig]# systemctl stop firewalld.service 
[root@webteam sysconfig]# systemctl start firewalld.service 
[root@webteam sysconfig]# firewall-cmd --permanent --add-port=4873/tcp  
success
[root@webteam sysconfig]# firewall-cmd --reload
success
[root@webteam sysconfig]# 

參考文件

2.2. 開機自啟動

ascs@webteam sinopia]$ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/ascs/.pm2/dump.pm2
[[email protected] .pm2]$ pm2 startup centos
[PM2] Init System found: systemd
-----------------------------------------------------------
 PM2 detected systemd but you precised centos
 Please verify that your choice is indeed your init system
 If you arent sure, just run : pm2 startup
-----------------------------------------------------------
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup centos -u ascs --hp /home/ascs
[[email protected] .pm2]$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup centos -u ascs --hp /home/ascs

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for ascs: 

2.3. 關於新增使用者失敗的問題

$ npm adduser
Username: webteam
Password:
Email: (this IS public) ([email protected])
npm ERR! code E500
npm ERR! Internal Server Error

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2018-05-08T13_17_14_767Z-debug.log

這個問題,在檢視sinopia伺服器之後,我發現是Linux目錄許可權問題。

[ascs@webteam sinopia]$ sinopia
 warn  --- config file  - /usr/share/nginx/html/sinopia/config.yaml
 warn  --- http address - http://0.0.0.0:4873/
 error --- unexpected error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/htpasswd'
Error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/htpasswd'
    at Error (native)
 http  <-- 500, user: undefined, req: 'PUT /-/user/org.couchdb.user:webteam', error: internal server error
 error --- unexpected error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/htpasswd'
Error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/htpasswd'
    at Error (native)
 http  <-- 500, user: undefined, req: 'PUT /-/user/org.couchdb.user:webteam', error: internal server error
^C

那麼怎麼解決這個問題呢?

仔細檢視Linux提示的錯誤,考慮遠端向sinopia服務新增使用者的時候,也是向linux目錄下寫檔案的時候,這個時候的資料夾,如果沒有其他使用者的寫許可權,那麼是沒有辦法寫入的。所以就會報錯。

解決方法:

進入sinopia的父級目錄,然後將sinopia目錄的許可權提升。

[ascs@webteam sinopia]$ cd ..
[ascs@webteam html]$ su
密碼:
[root@webteam html]# chmod 757 sinopia/
[root@webteam html]# ls -al
總用量 20
drwxrwxr-x+ 19 root root 4096 58 14:17 .
drwxr-xr-x.  3 root root   18 43 14:22 ..
-rw-rwxr--+  1 root root  537 53 16:40 50x.html
drwxr-xrwx   3 root root   40 54 19:57 sinopia

2.4. 關於釋出包失敗的問題

解決了新增使用者失敗的問題,結果釋出包又出了問題,為什麼呢?

$ npm publish
npm ERR! Unexpected token u in JSON at position 0

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2018-05-08T13_41_42_751Z-debug.log

檢視sinopia的日誌

/home/ascs/.pm2/logs/sinopia-error-1.log last 15 lines:
1|sinopia  | Error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/storage/.sinopia-db.json'
1|sinopia  |     at Error (native)
1|sinopia  |     at Object.fs.openSync (fs.js:642:18)
1|sinopia  |     at Object.fs.writeFileSync (fs.js:1348:33)
1|sinopia  |     at LocalData.sync (/usr/lib/node_modules/sinopia/lib/local-data.js:42:6)
1|sinopia  |     at LocalData.add (/usr/lib/node_modules/sinopia/lib/local-data.js:20:10)
1|sinopia  |     at updater (/usr/lib/node_modules/sinopia/lib/local-storage.js:251:27)
1|sinopia  |     at /usr/lib/node_modules/sinopia/lib/local-storage.js:582:5
1|sinopia  |     at /usr/lib/node_modules/sinopia/lib/local-fs.js:248:8
1|sinopia  |     at callback (/usr/lib/node_modules/sinopia/lib/local-fs.js:197:19)
1|sinopia  |     at onRead (/usr/lib/node_modules/sinopia/lib/local-fs.js:214:9)

沒錯,又碰上了許可權問題。老辦法,給.sinopia-db.json新增些許可權。

切換到root許可權,然後給檔案授權。

簡單粗暴的給了777,看官如果你要部署在公網上,請慎重喲。

[[email protected] storage]# chmod 777 .sinopia-db.json 
[[email protected] storage]# 
[[email protected] storage]# ls -al
總用量 4
drwxrwxrwx 3 root root  52 5月   8 21:55 .
drwxr-xrwx 3 root root  56 5月   8 21:37 ..
drwxrwxr-x 2 ascs ascs  90 5月   8 21:55 cityworks3d_cm
-rwxrwxrwx 1 root root 103 5月   8 21:55 .sinopia-db.json

再次釋出,成功!

$ npm publish
+ cityworks3d_cm@1.0.0

3. 隨之而來的問題:

3.1. npm的名稱空間問題

如果因為你起的包名與現有的包名太相近而被阻止釋出這個包,那麼找到一個獨一無二包名最簡單方法就是使用你的作用域。你可以使用@+你的npm使用者名稱加在包名前面將包劃到你的npm賬戶作用域下。比如,我的npm使用者名稱是ceejbot,所以我的作用域是@ceejbot。

在你自己的作用域下發佈一個包是免費的!你可以這樣去做:

我已經知道json-stream與現有包名太接近了,所以我需要找到一個新的名字。首先,我需要編輯我的package.json檔案,新增我的npm賬戶名來劃分一個作用域,所以:

{
    "name": "json-stream"
}

修改為:

{
    "name": "@ceejbot/json-stream"
}

然後我要釋出這個包。被劃了作用域的包預設是私有的,所以要通過—access=public 讓它變為公有的包:

> npm publish --access=public
+ @ceejbot/json-stream@1.0.0

每個人都可以向npm登錄檔中釋出公共的作用域包,但是你想釋出私有的包就要付費訂閱了。

參考文章

3.2. 生產環境中的使用

3.2.1. 容器部署

最佳實踐是將sinopia作為單獨服務部署在docker容器中

在此我製作了一個可以直接使用的Docker Image啟動容器則自動開啟服務, pm2將會守護sinopia程序

3.2.2. 版本控制

將sinopia作為公司內部npm庫還存在幾個問題

使用npm publish上傳的流程無法統一管理, 也就是無法持續整合/code review
每個版本的更新資訊完全依靠文件, 無法通過code diff追溯
以gitlab為例, 我的做法是

 將ci runner的伺服器切換至私有源, 使用npm adduser註冊一個root使用者

在sinopia伺服器上將sinopia/config.yaml中的max-users設定為-1, 禁止註冊與私自更新版本
將node庫原始碼在gitlab中建立專案 提交程式碼走PR流程
ci.yml中, build環境處理lint, unit test, production build等流程,tag環境npm publish提交版本, 保持gitlab與npm版本一致
郵件通知各組成員 庫版本更新資訊
3.2.3. 團隊使用

團隊所有成員切換npm至私有庫

推薦使用nrm庫 可以方便的切換npm源

nrm add private http://localhost:4873 # 新增源管理

nrm ls # 檢視源列表

nrm use private # 切換至該源

npm install @scope/[email protected]version --save-dev #

其它操作與npm公用庫相同

參考文章

4. 補充說明

4.1. NRM常用命令

nrm最常有的命令有 : 
1.nrm ls 檢視已有的源 
2.nrm add <源名稱> <源地址> 新增源 
3.nrm use <源名稱>切換到現有的源
4.nrm test  測速

4.2. 使用npm安裝包

使用 npm –save 標誌下載一個包


常規: npm install pkg, 快捷方式: npm i pkg.

常規: npm i --global pkg, 快捷方式: npm i -g pkg.(全域性安裝一個包)

常規: npm i --save pkg, 快捷方式: npm i -S pkg`.(安裝一個專案依賴包,寫進dependence)

常規: npm i --save-dev pkg, 快捷方式: npm i -D pkg`.(全域性安裝一個專案開發依賴包,寫進devDependence)

舉個栗子:

npm install lodash --save

這將會在下載包檔案之前修改 package.json 檔案的依賴關係欄位。現在開啟剛才建立的 package.json 檔案我們會發現多了個 dependencies 欄位。

相關推薦

構建前端團隊私有npm倉庫

有一點規模的團隊,都需要逐漸構建自己的npm包。現在有一個比較好的解決方案Sinopia,可以快速搭建和部署私有的npm伺服器。 本文詳細記錄了我在搭建私有npm包時,遇到的問題,以及個人的思考。 1. 安裝Sinopia 安裝 首先,你要自己配置n

私有 npm 倉庫的搭建

cnpm 是企業內部搭建 npm 映象和私有 npm 倉庫的開源方案,當企業業務邏輯相關的模組可能不適合開源。這部分私有的模組就可以放在私有 npm 倉庫中來管理和維護。 以下為搭建私有 npm 的詳細步驟,這裡使用了由阿里的團隊開源的 [cnpmjs.org][href1] ,主要分為

使用cnpm搭建私有NPM倉庫 釋出npm

關於如何使用cnpm搭建私有的npm倉庫看這裡→ http://blog.fens.me/nodejs-cnpm-npm/ 我本

基於cnpmjs.org構建企業私有npm

為什麼要搭建? npm——我們大家都知道是NodeJS的包管理工具,用於Node外掛的管理包括安裝、解除安裝、管理依賴等。 基於npm命令列我們可以快速的安裝專案中所依賴的程式碼模組,甚至可以自己釋出一些自己寫的外掛等。使得我們的專案開發效率得到大大的提升。 釋出到npm的模

nodejs+angularjs+npm+gulp+bower+jade+less構建前端框架

名詞解釋 nodejs:nodejs是這個框架的基礎,nodejs可以理解成js直譯器,相對於Python語言而言,以前執行js程式碼必須使用瀏覽器,現在就可以使用nodejs,nodejs還擴充了js語言,編寫了包括檔案,網路,程序管理在內的許多模組。 angularjs:angu

構建 Docker registry 私有映象,解決docker私有倉庫push出錯問題

適用於:Docker 1.8      環境:Centos7 每個版本的docker修改配置內容都不同,請大家看好安裝的docker版本。 1)下載 docker registry私有映象 docker pull docker.io/registry 2)修改

基於Nexus構建私有映象倉庫_Kubernetes中文社群

 1、 安裝Nexus Nexus是Sonatype提供的倉庫管理平臺,Nuexus Repository OSS3能夠支援Maven、npm、Docker、YUM、Helm等格式資料的儲存和釋出;並且能夠與Jekins、SonaQube和Eclipse等工具進行整合。Nexus支援作為宿主和

Ubuntu16.04使用Harbor構建Docker企業級私有倉庫

Ubuntu16.04使用Harbor構建Docker企業級私有倉庫 Harbor 安裝和部署 Docker安裝部署 Harbor安裝部署 簡單使用步驟 Harbor Harbor的官方說明:是一個用於

Dockerhub+Github構建kubernetes私有映象倉庫

部分kubernets映象存放在google映象倉庫中,由於無法訪問外網,這裡可以使用Docker Hub的自動構建功能將google映象構建到個人dockerhub倉庫中。 1. github建立倉庫 登入github,這裡建立一個名為kubernetes-images的倉庫,

Android業務組件化之Gradle和Sonatype Nexus搭建私有maven倉庫

Android 前言: 公司的業務組件化推進的已經差不多三四個月的時間了,各個業務組件之間的解耦工作已經基本完成,各個業務組件以module的形式存在項目中,然後項目依賴本地的module,多少有點不太利於項目的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴

創建自己的私有npm包並發布

images 成功 有一個 blog 兩個文件 輸出 strong 目錄 兩個 本文參考網上一些零散資料整理,比較系統的入門npm包的發布,幹貨在此: 1、下載node 地址:http://nodejs.cn/download/ 安裝完畢之後可打開cmd命令行測試是否安裝成

使用 gulp-file-include 構建前端靜態頁面

issue 官方文檔 type 也看 pan 循環 引入 pip 就是 前言 雖然現在單頁面很流行,但是在 PC 端多頁面還是常態,所以構建靜態頁面的工具還有用武之地。最近也看到了一些詢問如何 include HTML 文件的問題。 很多時候我們在寫靜態頁面的時候也希望

Miox帶你走進動態路由的世界——51信用卡前端團隊

完成 算法 這樣的 def pac 搜集 https 高效 整合 寫在前面: 有的時候再做大型項目的時候,確實會被復雜的路由邏輯所煩惱,會經常遇到權限問題,路由跳轉回退邏輯問題。這幾天在網上看到了51信用卡團隊開源了一個Miox,可以有效的解決這些痛點,於是乎我就做了一些嘗

Vue+Webpack構建前端工程

ont init clas imp simple config 打包 web 依賴 1.選擇一個目錄執行vue init webpack 工程名字<工程名字不能用中文>,若使用vue init webpack-simple 工程名字<工程名字不能用中文&g

005_解密餓了麽大前端團隊

ive 虛擬 線上 不解釋 成員 前端開發 聲明 文章 成就 最近,"大前端"這個詞被頻繁提及,很多團隊也在重新思考"大前端團隊"和"移動團隊+前端團隊"這兩種模式的優劣。而在大家還在熱火朝天地討論概念的時候,餓了麽大前端團隊已經茁壯成長,有了很多先人一步的實踐了。Info

006_餓了麽大前端總監sofish幫你理清前端工程師及大前端團隊的成長問題!

tar 由於 角色 分析 link 架構 實驗 遇到 優秀 作者|Sofish編輯|小智 & 尾尾本文是前端之巔向 sofish 的約稿《什麽樣的人可以稱為架構師?》、采訪《 餓了麽大前端團隊究竟是如何落地和管理的?》以及 sofish 做客大咖說直播節目的總結和整

在Kubernetes集群的etcd上搭建私有docker倉庫

etcd上搭建私有docker倉庫[root@etcd ~]# yum groupinstall -y "Development Tools"[root@etcd ~]# yum -y install epel-release[root@etcd ~]# yum -y install py

前端團隊的那些日子(初見)

怎麽 安裝 技術棧 哪些 AC 因此 素質 目前 給他 在現在這個團隊待了也有將近一年的時間, 基本上是看著它一步步成長的, 我也深受這個過程的影響, 翻看過去的日記, 有不少可圈可點的地方, 特此分享給那些在前端路上的新朋友 文章裏面的日期時間不要太過於關註, 因為很多都

搭建本地私有docker倉庫

搭建本地私有docker倉庫1、使用registry鏡像創建私有倉庫 docker run -d -p 5000:5000 --restart=always --name registry registry:2這條命令將自動下載並啟動一個registry容器,創建本地的私有倉庫--restart=alwa

搭建私有Nuget倉庫

詳細 data nuget realm class 請求 tab 應用 可能 使用Nexus搭建私有Nuget倉庫 https://www.cnblogs.com/Erik_Xu/p/9211471.html 前言   Nuget是ASP .NET Gallery的一員,是