最近把業務整理了一下,弄個組件庫給合做方使用,瞬間愜意了許多,可是隨之而來是npm包管理的諸多問題,主要是業務初期版本號快速增加致使的:版本號過多,版本號傳遞過程當中的繁瑣以及組件庫反覆安裝的痛苦,本文將着重解決這三個問題。
npm包版本號的快速增加帶來了如下幾個問題:html
以前真機測試只要發佈測試環境便可,可是如今要先發布npm包,安裝npm包,而後再發布測試環境,從一個步驟變成了三個步驟。git
版本號的快速更新致使每次都要通知相關同窗新的版本號,這中間還容易產生錯誤,致使安裝了錯誤的版本或者沒有及時更新。給測試同窗增長了負擔。npm
一個小小的功能上線了幾十個版本,從1.0.0增加到了1.0.3X,既挑戰了本身的容忍度,也挑戰了合做方的安全感。json
npm link可讓項目和要使用的npm包之間創建符號鏈接。
換句話說,若是在項目A中使用組件包B,以前要把B打包併發布,而後項目A安裝B,打包併發布測試環境才能驗證,如今只須要B打包一下,A直接打包併發布測試環境便可(A打包時獲取的是B在本地的打包文件, 即寫在B package.json中的main文件)安全
PS: 若是你是使用yarn的話,也有yarn link,並且yarn link還不會污染全局環境。架構
而要使用npm link, 要作到以下幾步:併發
在B包裏: npm link // 至關於npm install B -g 在A包裏: npm link B // 代碼無需修改,package.json中引用B的包會自動指向本地B的打包文件 A包發佈測試環境測試
使用npm link的方式,全部的小調整都不須要發包就能夠驗證正確性,尤爲是對於不能肯定正確的測試性改動,更加具備優越性。須要注意的是,去掉了npm包的版本控制以後, 必定要在git上作好代碼版本控制,不然有可能會出現丟失代碼的狀況。
tag能夠用來指帶版本號,用戶可使用npm install <name>@<tag>
安裝
對於絕大部分用戶,都是用npm install來安裝全部依賴的,這種狀況下,系統會自動安裝最新的版本號,須要注意的是,咱們會常常發出測試版本,這時候用戶若是安裝,那麼就會拉取到一個有問題的測試版本,因此咱們須要使用tag來區分版本。測試
另外,在聯調階段,反覆告知對方,咱們的版本號從1.3.1改爲1.3.x了是很蠢的,因此能夠指定一個tag維持版本的傳遞。同時,在B包裏使用npm info來觀察各個tag的版本號。spa
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。
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真是自討苦吃……
說幾個不太容易記得
~version:大概某個版本 ~1.2.1就是>=1.2.1 && <1.3.0
^version:向後兼容 ^1.2.1就是>=1.2.1 && <2.0.0
版本號格式:主版本號.次版本號.修補版本號
主版本號:新增功能,兼容老版本
次版本號:修復bug,兼容老版本
修補版本號:新的架構調整,不兼容老版本
具體能夠看《package.json中 npm依賴包版本前的符號的意義》
憑藉npm link和tag,咱們能夠儘量的減小調試步驟和庫包的發佈,從而造成良好的庫包管理。