npm如何管理依賴包的版本

amy_發表於2019-04-10

npm如何管理依賴包的版本

在寫專案的時候遇到了一個依賴包的版本問題,所以在這裡把它記錄下來。

問題描述:在本地開發的時候使用element-ui InputNumber元件的precision屬性,在本地開發的時候是好的,然後提測了發現這個precision屬性並沒有起作用。
出現這種問題的幾種可能:

  1. 測試環境的程式碼沒有更新;
  2. 測試環境的InputNumber元件的沒有這個precision屬性;

然後檢視測試環境的程式碼,發現和原生程式碼是一樣的。那麼造成的上面這種可能就是precision屬性問題了。查了測試環境element-ui的版本是2.3.*的版本,然後看了element-ui的更新日誌InputNumber元件的precision屬性是在2.4.0版本的時候新增的屬性。所以測試環境InputNumber元件的沒有這個precision屬性,故不起作用。為什麼我本地是好的呢,因為不知道在什麼時候我又重新安裝了依賴包,所以我本地的element-ui的版本是2.4.*的版本。

出現這種問題後,為了避免再次出現這種問題,在想怎樣實現鎖定依賴包的版本號。

下面將介紹npm如何管理專案依賴包的版本:

  1. 介紹語義化版本號
  2. 迴避最優版本號解決版本不一致問題
  3. 使用npm shrinkwrap解決版本不一致問題
  4. 本地安裝優於全域性安裝

語義化版本號

npm預設所有的Node包都使用語義化版本號,這是一套指導開發人員如何增長版本號的規則,要求:

  1. 每個版本號都形如:1.2.3,有三部分組成,依次叫‘主版本號’、‘次版本號’、‘修訂號’;
  2. 當新版本無法相容基於前一版本的程式碼時,則提高主版本號;
  3. 當新版本新增了功能和特性,但仍相容前一版本的程式碼時,則提高次版本號;
  4. 當新版本僅僅修正了漏洞或者增強了效率,仍然相容前一版本程式碼,則提高修訂號;

預設情況下,npm install --save下載的都是最新版本,並且會在package.json檔案裡登記一個最優版本號。我們在看package.json檔案時,可能會看到這兩種情況^2.4.0~2.4.1,最優版本號在數字之前多出了一個“標記”,^意味著下載的包可能會是更高的次版本號或者修訂版本號,而~意味著有可能會有更高的修訂版本號。

如果想要保證使用者和其他開發人員下載的依賴包與我們的程式碼相容,那麼可以用下面兩種辦法來鎖定專案的依賴包版本號。

迴避最優版本號

最簡單快捷的方法,就是不使用最優頒佈號。對於記錄在package.json裡的版本號,只需要把標記^~去掉即可。這個方法雖然簡單,但是有個缺陷:無法鎖定次級依賴的版本號。比如說你的專案依賴某個特定版本的element-ui,你可以按照上面的方法在 package.json裡去掉最優版本的標記。 而這個版本的element-ui有自己的package.json,裡面記錄的依賴包使用的很可能還是最優版本號。那麼這樣就有點複雜了。

使用npm shrinkwrap命令

現在的問題關鍵在與如何鎖定依賴之依賴的版本號。npm有一個指令來解決這個問題:npm shrinkwrap

在你開發專案時,進行到某個節點,一切都執行的順利,說明目前所有的依賴包和你的程式碼相容的很好。這個時候,你就可以在你專案資料夾下執行上面這個命令。它會生成一個npm-shrinkwrap.json檔案,記錄目前所有依賴包(及更底層依賴包)的版本資訊。這樣當以後其他人執行npm install命令時,npm首先會找到npm-shrinkwrap.json檔案,依照其中的資訊準確的安裝每一個依賴包,只有當這個檔案不存在時,npm才會使用package.json

本地安裝優於全域性安裝

npm安裝依賴包時有兩種模式:本地安裝和全域性安裝。本地安裝表示依賴包會被下載到當前專案的node_modules檔案裡,而全域性安裝則會把他安裝到系統級別的目錄裡。

相關文章