選擇性相依套件解決方案

Yarn支援通過 package.json 文件中的 resolution 欄位選擇和解析版本並定義自己的相依套件版本的功能。 通常需要手動編輯 yarn.lock 文件。

Why would you want to do this?

  • 有些時候,專案會相依於一個不常更新的套件,但這個套件又相依於另一個需要立即升级的套件。 這時候,如果這個不常更新的套件的依賴列表裡不包含需要升级的套件的新版本,那就只能等待作者升级,没别的辦法。

  • 專案的子依賴需要緊急安全更新,來不及等待直接依賴更新。

  • 專案的直接依賴還可以正常工作但已經停止維護,這時子依賴需要更新。 同時,你清楚子依賴的更新不會影響現有系统,但是又不想透過 fork 的方式來升级直接依賴。

  • 專案的直接依賴定義了過於廣泛的子依賴版本範圍,恰巧這其中的某個版本有問題,這時你想要把子依賴限制在某些正常工作的版本範圍中。

How to use it?

package.json 文件中加入 resolutions 欄位,以此覆蓋版本定義:

package.json

{
  "name": "project",
  "version": "1.0.0",
  "dependencies": {
    "left-pad": "1.0.0",
    "c": "file:../c-1",
    "d2": "file:../d2-1"
  },
  "resolutions": {
    "d2/left-pad": "1.1.1",
    "c/**/left-pad": "1.1.2"
  }
}

之後執行 yarn install

Tips & Tricks

  • 若你定義了無效的版本解析規則,比如用了錯誤的套件名稱,你將會得到警告
  • 如果定義的版本解析的版本號、版本號為無效,也會收到警告。
  • 如果定義的版本解析規則的版本號、版本範圍與原版本範圍不相容,同樣會收到警告。

Limitations & Caveats

  • 巢狀套件(Nested packages)可能會無法運作。
  • 這是一項新功能,因此會在某些極端的情况下無法正常運作。