JavaScript
npm
YARN
yarnpkg

yarnのselective dependency resolutions機能

More than 1 year has passed since last update.

yarn v1.0.0で追加された機能

何ができるか

dependency graphの完全なコントロールが可能になる

  • package.jsonとyarnだけでコントールする
  • 自分が使ってるnpm pkgが依存してるpkg(dependencies of dependencies)のversionを指定してインストールできるようになる。
➜  material-ui git:(master) npm outdated
Package                       Current         Wanted  Latest  Location
babel-eslint                    7.2.3          7.2.3   8.0.1  material-ui-build
babel-loader                    6.4.1          6.4.1   7.1.2  material-ui-build
chai                            3.5.0          3.5.0   4.1.2  material-ui-build
coveralls                      2.13.3         2.13.3   3.0.0  material-ui-build
cross-env                       4.0.0          4.0.0   5.0.5  material-ui-build
enzyme                          2.9.1          2.9.1   3.1.0  material-ui-build
eslint                         3.19.0         3.19.0   4.8.0  material-ui-build
fs-extra                        2.1.2          2.1.2   4.0.2  material-ui-build
istanbul                1.1.0-alpha.1  1.1.0-alpha.1   0.4.5  material-ui-build
jsdom                          9.12.0         9.12.0  11.3.0  material-ui-build
mocha                           3.5.3          3.5.3   4.0.1  material-ui-build
react                          15.6.2         15.6.2  16.0.0  material-ui-build
react-dom                      15.6.2         15.6.2  16.0.0  material-ui-build
react-test-renderer            15.6.2         15.6.2  16.0.0  material-ui-build
react-transition-group          1.2.1          1.2.1   2.2.1  material-ui-build
sinon                           3.3.0          3.3.0   4.0.1  material-ui-build
webpack                        1.15.0         1.15.0   3.6.0  material-ui-build
  • material-uiが依存するreact-transition-group では 1.2.1が指定されてるが、最新版の 2.2.1 がインストールされるように変更できる
  • yarn.lock も更新される

使い方

"resolutions": {
    "material-ui/react-transition-group": "2.2.1"
}
  • package.jsonresolutions フィールドを追加し、上書きしたい依存パッケージを指定する
  • /でネストの深さが表され、glob patternもちょっとだけサポートしてる
    • some-middle-ware/**/request

使いどころ

  • 依存パッケージの依存パッケージ(、の依存パッケージ・・・・)が原因でエラーを吐くようになったが、すでにそのモジュールではパッチがリリースされてる場合
    • react-nativeでmetro-bundlerのversionを変える
    • UIライブラリが依存してるmoment.jsのversionを変えたいとき

スコープ外のこと

  • いわゆるleftpad問題
    • dependencies treeのどっか深いとこにあるモジュールが、npm registoryからunpublishされてしまってるケース
    • こっちは別ソリューション必要
    • expo.ioがやってるようなscoped packageにコピーをホストしてunpublished対策するとか
    • @expo/vector-icons

そのうちしらべる

代替ソリューション

resources