npm install 依賴包 報錯問題及版本輔助工具


具有不確定性依賴性的問題

您設置了一個新的Node JS / Webpack項目使用npm install安裝了所有依賴項,並且您的應用程序運行平穩。一周后,已指派另一位開發人員與您一起工作。因此,他/她克隆了它,並通過npm install來安裝依賴項,然后他們運行該應用程序,並且突然到處都是錯誤!感到困惑的是,您查看了您的代碼,並且代碼正常工作。它們具有相同的依賴關系和相同的代碼,為什么該應用程序無法在您同事的計算機上運行?

 
圖片發布

答案是不良的依賴樹管理這是每個開發人員都面臨NPM生態系統中的常見問題

圖書館的變化和發展確實非常快,他們很少正確地進行版本控制。我談論的不是文檔和測試,而是完全不同的故事。甚至一個月大的圖書館示例代碼也經常損壞,您需要搜索更改日志以找出更改的內容。

假設您對模塊X @ version〜1.0.1有依賴性模塊X取決於模塊Y @ version ^ 1.1.0,模塊Y取決於模塊Z @ version ^ 1.2.0

如果模塊Z決定發布新版本1.3.0,則在運行NPM install時,它將自動升級到1.3.0,因為在package.json中將其指定為^(caret)重要的是,這是在幕后發生的,因為對您來說,您正在安裝模塊X ,但您無法真正分辨出模塊X對模塊Y和模塊Z的依存關系類型。這就是有時您的項目出現的原因可以在您的計算機上運行,​​然后在幾周后在其他人的計算機上失敗。

 
圖片發布

在繼續之前,我想介紹一下NPM中語義版本控制的基礎知識:

語義版本控制

SemVer非常流行,並且是javascript Universe中被濫用的軟件版本控制方案。

你做對了!我說“濫用”。因為流行庫的許多貢獻者通常不關心或破壞語義版本控制的規則。

給定版本號MAJOR.MINOR.PATCH,增加:

  • 補丁:錯誤修復和其他較小更改:補丁發布,增加最后一個數字,例如0.0.1
  • MINOR:不破壞現有功能的新功能:次要版本,增加中間數字,例如0.1.0
  • 重要:更改會破壞向后兼容性:主要發行版,請增加第一個數字,例如1.0.0

附言 npm中的所有軟件包都必須遵循上述規則。

由於許多貢獻者沒有遵循這些模式,因此又與NPM的存儲規則相沖突。讓我們檢查一下為什么要考慮這一點非常重要。

我們知道SemVer的前綴^(caret)符號會將您更新到最新的次要版本或補丁程序級別。考慮JQuery

"jquery": "^3.0.1"

那么以下所有文件都可以由NPM自動安裝:3.1.1、3.0.2、3.0.4、3.5.3等。

提示#1結帳semvem計算器

這意味着您的安裝將是不確定的,因為您允許安裝程序在當前時間安裝與您的規則匹配的模塊的版本當模塊的作者由於不遵循SemVer的規則而發布錯誤或代碼中斷的更新時,這就為錯誤提供了巨大的空間。

作者在庫API中的主要更新將被標記為補丁程序或軟件包版本中的次要更新。

好。該如何處理?

你不需要。NPM@5.xx會照顧您。如果您使用的是npm ^ 5.xx,則默認情況下將為您生成package-lock.json應該將其提交給源控件,例如Git等。這是NPM @ 5的新鎖定文件功能,其中包含當前依賴關系樹的快照,並允許在機器之間進行可復制的構建。

您可能會想到,使用npm shrinkwrap和它可以實現相同的效果npm-shrinkwrap.json是的,你是對的。

 
圖片發布

創建新文件的主要原因是為了更好地傳達NPM確實支持鎖定的信息,這顯然是過去版本中的主要問題。

  • NPM強制執行package-lock.json從未出版,甚至你加它明確。
  • npm-shrinkwrap.json但是,文件可以是已發布程序包的一部分,即使嵌套依賴,NPM也會尊重文件

接下來,您可能想知道npm shrinkwrap在已經包含的目錄中運行時會發生什么package-lock.json答案很簡單,因為它們共享相同的格式package-lock.jsonnpm-shrinkwrap.json所以NPM只會重命名

太酷了,但是什么時候使用新的鎖定文件而不是舊的拆封文件,反之亦然?通常取決於您正在處理的軟件包的類型。

好吧,如果您正在使用其他人將依賴的公共庫,則應在開發最終用戶在終端中使用的軟件包時使用新的鎖定文件(package-lock.json)並使用npm- shrinkwrap.json例如CLI-tools..etc或捆綁的可執行文件。

提示#2您始終可以查看使用發行的軟件包的外觀npm pack

概要

  • 如果您使用的是npm ^ 5.xx,則默認情況下將為您生成package-lock.json
  • 如果您的應用程序提供了API,並且使用semver規則,請使用semver。
  • 不要刪除 package-lock.jsonnpm- shrinkwrap.json文件。
  • 應該將包鎖提交給VCS。
  • 使用以下命令使模塊保持最新狀態 npm outdated

提示#3使用npmvet確實管理本地安裝的npm軟件包版本非常有用。

 
圖片發布


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM