簡體   English   中英

npm:引用一個peer依賴; 如何從對等依賴項中對齊版本

[英]npm: refer to a peer dependency; how to align the version from a peer dependency

抽象地說,我對提供的dependency-B版本沒問題,由於dependency-A已經安裝了它。

  "dependencies": {
    "dependency-A": "x.y.z",
   }
$> npm ls --depth=1
├─┬ dependency-A@x.y.z
│ ├── dependency-B@x.y.z

所以當我require('dependency-B')時,我會期望A 的依賴。
我正在使用該庫中的根 function,事實上,如果dependency-A會影響版本,我想與它對齊並使用它使用的相同版本。

如果dependency-B -B,則將安裝全新的 package。

  "dependencies": {
    "dependency-A": "x.y.z",
    "dependency-B": "a.b.c",
   }
$> npm ls --depth=1
├─┬ dependency-A@x.y.z
│ ├── dependency-B@x.y.z
│ ├── ...
├─┬ dependency-B@a.b.c

我很想不在我的依賴項中列出dependency-B 我應該避免這種做法嗎? 依賴我的主要依賴安裝的對等版本不行嗎?


如果這是一個錯誤的做法,我怎么能告訴 npm 給我它由另一個 package 安裝的完全相同的版本?

  "dependencies": {
    "dependency-A": "x.y.z",
    "dependency-B": "~try the one that is installing dependency-A~",
   }

tl;dr :您應該始終擁有您在自己的dependencies項 object 中使用的所有依賴項,因為 package 管理器的一致實現不需要讓您訪問依賴項的依賴項。

這是一個有趣的問題,我可以想到您可能會遇到的兩種情況:

  1. 出於您自己的一系列原因,您的 package 和dependency-A都獨立使用dependency-B ,而您根本不在乎使用哪個版本。
  2. 您需要使用dependency-B來與dependency-A交互,方法是創建 B 的對象或接收 A 創建的 B 的對象。

場景一:獨立使用

If you and your dependency need the same package but don't need to share anything about it, Node gives you the amazing ability of using different versions of the same package in different places by specifying different versions in the package.json of your package and你圖書館的。 這是 Node 模塊系統的優勢之一。

但是,您的情況是您不關心 package 的實際版本(這讓我認為這不是您的情況)。 特別是,您想知道是否最好不要在自己的package.version中定義任何內容,而讓 Node 找到您的依賴項的依賴項。

最后一種情況是唯一可能的,因為您使用的是npm ,並且npm做了一件特別的事情:它扁平化模塊樹以消除重復數據包,也就是說,同一版本可以滿足的多個依賴項規范是,最后,使用完全相同的版本。 這會減少模塊樹的大小和深度,但會產生意想不到的后果,即您現在可以訪問尚未指定為依賴項的包,只是因為它們已安裝在您的node_modules目錄中以進行重復數據刪除。

這不是唯一可能的策略,並且pnpm ,另一個 package 管理器,而是使用符號鏈接來實現相同的目標。 我不會詳細介紹,但pnpm將所有依賴項安裝在不同的系統范圍(或用戶特定)目錄中,然后從您的node_modules (以及依賴項自己的node_modules )符號鏈接到其中的適當位置文件夾。 這不僅實現了項目重復數據刪除,而且實現了系統范圍的重復數據刪除,因為使用特定 package 版本的所有項目都將使用相同的安裝 然而,這個系統的后果是你“失去”了在你自己的 package 中使用依賴項的依賴項的能力,因為它們實際上不再位於node_modules

除此之外,您不關心他們使用的版本的想法。 幾乎從來沒有這種情況,因為語義版本控制的重點是避免或包含由於依賴版本升級而導致的損壞。 您不關心您現在使用的版本,但是如果 package 在您的依賴項中升級到不同的主要版本,您的 package 可能會意外中斷。

總之,不定義您將要使用的依賴項是一種不好的做法,因為它會阻止其他開發人員在不同的 package 管理器中使用您的 package,並且因為它會使您面臨無法預料的破壞要妥善管理。

場景 2:依賴使用

鑒於您對問題的描述,更有可能的情況是,在您使用dependency-A的某個時刻,它要么要求某些東西,要么從dependency-B返回某些東西。 在這種情況下,希望兩者都使用相同的或至少兼容的版本,以便所有關於正在交換的對象形狀的假設都成立。

指定這種情況的正確方法是將dependency-B顯式聲明為dependency-A的對等依賴項。 如果不是這種情況,那么它們就是不正確的,如果可能的話,您絕對應該在問題中提出這一點。 作為一種解決方法,您可以只聲明與他們相同的版本,並注意他們的版本升級可能導致的損壞。 在您自己的package.json中未定義任何內容可能會遇到與場景 1 中相同的問題。

但是,另一種可能性是您甚至require該依賴項 可能是他們希望您傳遞數據、函數、對象或任何將進一步傳遞給dependency-b東西,但以某種方式使您不必直接與dependency-B交互。 在這種情況下,他們實質上是將 B 的 API 的一部分合並到自己的中,因此dependency-B任何重大更改也應該導致dependency-A的重大更改。 這可以保護您免受意外損壞,避免您必須在package.json中定義任何內容,這意味着您是安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM