一篇文章解決npm私有包頻繁開發調試

最近把業務整理了一下,弄個組件庫給合做方使用,瞬間愜意了許多,可是隨之而來是npm包管理的諸多問題,主要是業務初期版本號快速增加致使的:版本號過多,版本號傳遞過程當中的繁瑣以及組件庫反覆安裝的痛苦,本文將着重解決這三個問題。

1. 面臨的問題

npm包版本號的快速增加帶來了如下幾個問題:html

  • 調試變得不方便

以前真機測試只要發佈測試環境便可,可是如今要先發布npm包,安裝npm包,而後再發布測試環境,從一個步驟變成了三個步驟。git

  • 聯調困難

版本號的快速更新致使每次都要通知相關同窗新的版本號,這中間還容易產生錯誤,致使安裝了錯誤的版本或者沒有及時更新。給測試同窗增長了負擔。npm

  • 醜陋的包版本號

一個小小的功能上線了幾十個版本,從1.0.0增加到了1.0.3X,既挑戰了本身的容忍度,也挑戰了合做方的安全感。json

2. 處理方案

1.1 調試時使用npm link

npm link可讓項目和要使用的npm包之間創建符號鏈接。

換句話說,若是在項目A中使用組件包B,以前要把B打包併發布,而後項目A安裝B,打包併發布測試環境才能驗證,如今只須要B打包一下,A直接打包併發布測試環境便可(A打包時獲取的是B在本地的打包文件, 即寫在B package.json中的main文件安全

PS: 若是你是使用yarn的話,也有yarn link,並且yarn link還不會污染全局環境。架構

clipboard.png

而要使用npm link, 要作到以下幾步:併發

在B包裏:
npm link // 至關於npm install B -g
在A包裏:
npm link B // 代碼無需修改,package.json中引用B的包會自動指向本地B的打包文件
A包發佈測試環境測試
使用npm link的方式,全部的小調整都不須要發包就能夠驗證正確性,尤爲是對於不能肯定正確的測試性改動,更加具備優越性。須要注意的是,去掉了npm包的版本控制以後, 必定要在git上作好代碼版本控制,不然有可能會出現丟失代碼的狀況。

1.2 發佈時使用tag

tag能夠用來指帶版本號,用戶可使用npm install <name>@<tag>安裝

對於絕大部分用戶,都是用npm install來安裝全部依賴的,這種狀況下,系統會自動安裝最新的版本號,須要注意的是,咱們會常常發出測試版本,這時候用戶若是安裝,那麼就會拉取到一個有問題的測試版本,因此咱們須要使用tag來區分版本。測試

另外,在聯調階段,反覆告知對方,咱們的版本號從1.3.1改爲1.3.x了是很蠢的,因此能夠指定一個tag維持版本的傳遞。同時,在B包裏使用npm info來觀察各個tag的版本號。spa

clipboard.png

npm publish --tag <tag>

使用latest來設置用戶npm install默認安裝的版本,使用alpha來設置測試版本,當測試版本測試完畢以後,使用3d

npm dist-tag add <pkg>@<version> [<tag>]

來切換不一樣tag的版本號,例如,1.3.1已經測試完成,咱們可使用
npm dist-tag add B@1.3.1 latest來把本來屬於alpha的分支切到latest。tag不加的話默認是latest。

固然,還能夠經過mpm dist-tag add來添加你本身的tag。

2. 相關知識

2.1 package.json與package-lock.json

package.json:用於標註項目中對各個npm包的依賴。
package-lock.json:用於記錄當前狀態下實際安裝的各個npm package的具體來源和版本號。

因爲package.json中默認是@tencent/newsH5Ad: '^1.3.1',^指的是向後兼容,這就致使npm i的時候,裝得庫的版本和以前裝得並不同(有可能版本號會更新一些),而這個時候如果npm包開發者沒有遵照——」相同的大版本號的包,接口保持兼容「——沒錯了,說的就是我——就會出現兼容性問題。爲了解決這個問題,因此纔有了package-lock.json。

在npm的不一樣版本下,package-lock.json有不一樣的表現。最新的在npm 5.4.2版本以後:

若是改了package.json,且package.json和lock文件不一樣,那麼執行 npm i時npm會根據package中的版本號以及語義含義去下載最新的包,並更新至lock。若是二者是同一狀態,那麼執行 npm i都會根據lock下載,不會理會package實際包的版本是否有新。[1]

說到這裏,package-lock.json就是yarn.lock的某種實現,其實就應該使用yarn, 使用npm i真是自討苦吃……

2.2 版本號前的字符含義

說幾個不太容易記得
~version:大概某個版本 ~1.2.1就是>=1.2.1 && <1.3.0
^version:向後兼容 ^1.2.1就是>=1.2.1 && <2.0.0

版本號格式:主版本號.次版本號.修補版本號

主版本號:新增功能,兼容老版本
次版本號:修復bug,兼容老版本
修補版本號:新的架構調整,不兼容老版本

具體能夠看《package.json中 npm依賴包版本前的符號的意義

3. 總結

憑藉npm link和tag,咱們能夠儘量的減小調試步驟和庫包的發佈,從而造成良好的庫包管理。

相關文章
相關標籤/搜索