pm2與Verdaccio搭建私有npm庫過程詳解
前言
最近開會的時候討論到前端組件庫搭建,因為需要多人協(xié)作,使用npm link等都比較麻煩,且當業(yè)務規(guī)模較大了之后,我們一般會有自己的腳手架,自己的全局工具包等等。其中可能包含了自身的業(yè)務代碼不能公開,因此我們都需要一個私有化的npm倉庫。
一般私有化的npm倉庫有以下幾種方法實現(xiàn):
- 通過npm購買私有服務
- 通過git直接引用
- 通過開源項目直接搭建,例如cnpm、verdaccio、sinopia等
下面對各個方案進行一個粗淺的對比:
- 官方私有npm服務:團隊版$7/人/月這個價格就已經(jīng)直接勸退,且不說npm在國內的網(wǎng)絡情況不容樂觀。
- 直接安裝git代碼:直接通過npm install 引入對應git代碼確實有一定的便利性,但是當全局包多了之后不便于維護且權限難以管理
- sinopia:基于Node.js實現(xiàn)的一個開源npm庫,年久失修。最近一次提交是6年前,直接放棄。
- cnpm:阿里出的npm私有方案,權限控制較為全面但是配置復雜,需要自己搭建mysql之類的數(shù)據(jù)庫存儲。
- verdaccio:基于sinopia繼續(xù)開發(fā),目前維護很頻繁而且配置簡單,可以快速搭建。
為什么選用Verdaccio?
先跟大家吐個槽,其實我本來是想用sinopia搭建的私服,也知道大家也都傾向于sinopia來搭,畢竟它出道比較早,知名度比較高,但是sinopia的作者幾年前就已經(jīng)停止了對sinopia的維護和升級,不信大家可以自己去GitHub上看,上次更新真的停留在了幾年前,唉,然后真是留了一堆坑,所幸不是沒人管,只是有一群人又出了一個sinopia的fork,也就是sinopia的分支,而且還起了個洋氣的意大利名verdaccio ,但是verdaccio 確實是正在維護的,我查了最近一次更新還是在2天前,這幫人還是挺勤快的,造福了大家啊~ 而且也比較好用,我用sinopia搭的時候填的一堆坑在verdaccio 這壓!根!不!存!在!真是絕望啊,為啥我沒有早點發(fā)現(xiàn)它。這里是verdaccio 在github的源碼地址,大家想深入了解最好還是去看看源碼和詳細介紹。話不多說下面正式開始verdaccio的搭建。
安裝
Verdaccio 的安裝啟動過程較為簡單。首先是全局安裝 Verdaccio:
npm i -g verdaccio
然后,在終端中輸入 verdaccio 命令啟動 Verdaccio:
接著 Verdaccio 會在終端中輸出提示,輸出它的配置文件位置、啟動的服務地址等信息:
默認 Verdaccio 啟動的服務都會在 4873 這個端口,在瀏覽器中打開這個地址我們就會看到 Verdaccio 搭建的私有庫 npm 的界面:
修改配置
雖然,安裝和啟動好了 Verdaccio。但是,由于 Verdaccio 默認的配置和我們生產(chǎn)的需求不一致,所以我們需要修改一下 Verdaccio 的配置。
在生產(chǎn)環(huán)境下,私有 npm 庫需要具備以下 3 個功能:
- 支持對 npm 包的搜索
- 嚴格的權限把控,npm 包的訪問只能是已注冊的用戶。并且在一些場景下,需要刪除用戶
配置文件
npm i -g verdaccio
# 存放軟件所有軟件包的目錄 storage: ../storage # 存放所有插件的目錄 plugins: ../plugins web: # 網(wǎng)站Title title: Verdaccio # 禁用Gravatar頭像 # gravatar: false # 排序方式 asc|desc # sort_packages: asc # 是否啟用暗黑模式 # darkMode: true # logo地址 # logo: http://somedomain/somelogo.png # favicon地址 # favicon: http://somedomain/favicon.ico | /path/favicon.ico # i18n翻譯配置 # i18n: # 可用列表見:https://github.com/verdaccio/ui/tree/master/i18n/translations # web: en-US auth: htpasswd: file: ./htpasswd # 最大注冊用戶數(shù),默認為 "+inf". # 可用通過設置為-1禁止注冊 # max_users: 1000 # 上游npm庫,這里可用設置為淘寶 uplinks: npmjs: url: https://registry.npmjs.org/ packages: # 作用域包 '@*/*': # 允許所有人訪問 access: $all # 注冊用戶可訪問 publish: $authenticated # 注冊用戶可訪問 unpublish: $authenticated proxy: npmjs '**': # 默認情況下所有用戶 (包括未授權用戶) 都可以查看和發(fā)布任意包 # 你可以指定 用戶名/分組名 (取決于你使用什么授權插件,默認的授權插件是內置的 htpasswd) # 訪問權限有三個關鍵詞: "$all", "$anonymous", "$authenticated" # $all 表示不限制,任何人可訪問; # $anonymous 表示未注冊用戶可訪問; # $authenticated 表示只有注冊用戶可訪問 access: $all # 允許所有注冊用戶發(fā)布/撤銷已發(fā)布的軟件包 # (注意:默認情況下任何人都可以注冊) publish: $authenticated unpublish: $authenticated # 如果私有包服務不可用在本地,則會代理請求到'npmjs' proxy: npmjs # 您可以指定傳入連接的HTTP /1.1服務器保持活動超時(以秒為單位)。 # 值為0會使http服務器的行為類似于8.0.0之前的Node.js版本,后者沒有保持活動超時。 # 解決方法:通過給定的配置可以解決以下問題 server: keepAliveTimeout: 60 # 中間件 middlewares: audit: enabled: true # 日志設置 logs: { type: stdout, format: pretty, level: http } # 開放遠程訪問,允許所有IP listen: - 0.0.0.0:4873
這里我們來逐個認識一下默認配置中的幾個值的含義:
字段 | 含義 |
---|---|
storage | 已發(fā)布的包的存儲位置,默認存儲在 ~/.config/Verdaccio/ 文件夾下 |
plugins | 插件所在的目錄 |
web | 界面相關的配置 |
auth | 用戶相關,例如注冊、鑒權插件(默認使用的是 htpasswd) |
uplinks | 用于提供對外部包的訪問,例如訪問 npm、cnpm 對應的源 |
packages | 用于配置發(fā)布包、刪除包、查看包的權限 |
server | 私有庫服務端相關的配置 |
middlewares | 中間件相關配置,默認會引入 auit 中間件,來支持 npm audit 命令 |
logs | 終端輸出的信息的配置 |
權限把控
權限把控指的是我們需要私有 npm 庫上發(fā)布的包只能團隊成員查看,除此之外人員不能看到一切信息。那么,回到 Verdaccio,我們需要做這 2 件事:
- 限制 npm 包的查看,只能為已注冊的用戶
- 禁止用戶注冊(在團隊成員已注冊完成后)
相應地,這里我們需要修改配置文件的 pacakges 和 auth。前面我們也提及了 packages 是用于配置發(fā)布包、查看包、刪除包相關的權限。我們先再來看看默認的配置:
packages: '@*/*': access: $all publish: $authenticated unpublish: $authenticated proxy: npmjs '**': access: $all publish: $authenticated unpublish: $authenticated proxy: npmjs
這里的 key 代表對應權限需要匹配的包名,例如對于第一個,如果我們發(fā)布的包名是這樣的 @wjc/test 就會命中。每個規(guī)則中對應 4 個參數(shù)。其中 proxy 代表如果在私有 npm 庫找不到,則會代理到 npmjs(對應 unlinks 中的 npmjs 的 registry.npmjs.org/)。而剩下的 3 個參數(shù),都是用來設置包相關的權限,它有三個可選值 all(所有人)、all(所有人)、all(所有人)、anonymous(未注冊用戶)、$authenticated(注冊用戶)。那么,下面我們分別看一下這 3 個參數(shù)的含義:
- access 控制包的訪問權限
- publish 控制包的發(fā)布權限
- unpublish 控制包的刪除權限
顯然,這里我們需要的是只有用戶才能具備上述 3 個權限,即都設置為 $authenticated:
'@*/*': access: $authenticated publish: $authenticated unpublish: $authenticated proxy: npmjs '**': access: $authenticated publish: $authenticated unpublish: $authenticated proxy: npmjs
設置好 packages 后,我們還得更改 auth 的值,因為此時注冊用戶是沒有限制的,也就是說如果你的私有 npm 庫部署在外網(wǎng)環(huán)境的話,任何人都可以通過 npm adduser 命令注冊用戶。
顯然,這是不允許出現(xiàn)的情況,所以這里我們需要設置 auth 的 max_users 為 -1,它代表的是禁用注冊用戶:
auth: max_users: -1
部署
verdaccio提供了docker和全局包2種方式進行安裝,下面是兩種安裝方式的詳細步驟
docker部署
docker不太熟,感興趣的可以去嘗試。
# 拉取verdaccio docker鏡像 $ docker pull verdaccio/verdaccio:nightly-master # 查看docker鏡像 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE verdaccio/verdaccio nightly-master 32713721fda5 16 hours ago 580MB # 拷貝下面配置文件到本地~/docker/verdaccio目錄 $ cp config.yaml ~/docker/verdaccio # 啟動docker容器 # -d: 在后臺開啟docker進程 # --name: 給容器指定一個名稱 # --p: 將本機的4873端口映射到docker的4873端口 # --restart=always: 自動重啟容器 # -v: 將本地~/docker/verdaccio目錄掛載到docker的/verdaccio/conf目錄 $ docker run --restart=always -d -v ~/docker/verdaccio:/verdaccio/conf --name verdaccio -p 4873:4873 verdaccio/verdaccio # 查看docker容器 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6aac1ea8707a verdaccio/verdaccio "uid_entrypoint /bin…" 2 minutes ago Up 2 minutes 0.0.0.0:4873->4873/tcp, :::4873->4873/tcp verdaccio
這樣我們就完成了verdaccio在docker上的部署,其中我們將~/docker/verdaccio這個文件夾掛載到docker的/verdaccio/conf文件夾,verdaccio在啟動時會自動尋找/verdaccio/conf/config.yaml文件作為配置。
pm2部署
pm2的部署相對于docker需要安裝node。但是相對的部署起來會更快捷,可以根據(jù)自己需要選擇。
管理npm倉庫源
這里推薦使用nrm來管理npm的源
# 全局安裝nrm $ npm install -g nrm # 添加私有庫 $ nrm add verdaccio http://{地址}:4873/ # 查看現(xiàn)有的npm源 $ nrm ls npm ---------- https://registry.npmjs.org/ yarn --------- https://registry.yarnpkg.com/ tencent ------ https://mirrors.cloud.tencent.com/npm/ cnpm --------- https://r.cnpmjs.org/ taobao ------- https://registry.npmmirror.com/ npmMirror ---- https://skimdb.npmjs.com/registry/ * verdaccio ---- http://{地址}:4873/ # 設置npm源 $ nrm use verdaccio
npm包發(fā)布
注冊
# 注冊用戶,這里因為方便演示,所以沒有關閉注冊。Username:用戶名 Password:密碼 $ npm adduser npm notice Log in on http://{地址}:4873/ Username: yourusername Password: Email: (this IS public) xxxxxx@qq.com Logged in as yourusername on http://{地址}:4873/.
登錄
# 登錄用戶 $ npm login npm notice Log in on http://{地址}:4873/ Username: yourusername Password: Email: (this IS public) xxxxxx@qq.com Logged in as yourusername on http://{地址}:4873/ # 查看當前登錄用戶 $ npm who am i yourusername
發(fā)布
# 發(fā)布當前包 $ npm publish npm notice Hui-ui-vue@0.1.0 npm notice === Tarball Contents === npm notice 611B public/index.html npm notice 4.3kB public/favicon.ico npm notice 73B babel.config.js npm notice 151B packages/baseInput/index.js npm notice 214B packages/index.js npm notice 130B examples/main.js npm notice 730B vue.config.js npm notice 891B package.json npm notice 310B README.md npm notice 6.8kB examples/assets/logo.png npm notice 344B examples/App.vue npm notice 199B packages/baseInput/src/baseInput.vue npm notice 2.0kB examples/components/HelloWorld.vue npm notice === Tarball Details === npm notice name: Hui-ui-vue npm notice version: 0.1.0 npm notice package size: 10.5 kB npm notice unpacked size: 16.8 kB npm notice shasum: 08de3054edbef6c1706f849e40d05e99c16c607e npm notice integrity: sha512-6sVp52WobtHhq[...]bXfgebrphWd+Q== npm notice total files: 13 npm notice + Hui-ui-vue@0.1.0 # 最后看到 + [你的包名@版本號]既可
需要注意的是相同的包上傳時版本號需要不同,否則上傳會失敗。
刪除
進入包文件路徑直接刪除即可。
以上就是pm2與Verdaccio搭建私有npm庫過程詳解的詳細內容,更多關于pm2 Verdaccio搭建npm庫的資料請關注腳本之家其它相關文章!
相關文章
服務端nodejs抓取jsonp接口數(shù)據(jù)實現(xiàn)示例
這篇文章主要為大家介紹了服務端nodejs抓取jsonp接口數(shù)據(jù)實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06如何在NestJS中添加對Stripe的WebHook驗證詳解
這篇文章主要為大家介紹了如何在NestJS中添加對Stripe的WebHook驗證詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Electron調用外接攝像頭并拍照上傳實現(xiàn)詳解
這篇文章主要為大家介紹了Electron調用外接攝像頭并拍照上傳實例實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02