Edited at

package-lock.json yarn.lock をコンフリさせない方法

yarn.lock が意図しないときに更新されてコンフリすることありませんか?

この問題をバージョニングを固定して解決する Tips の紹介です。

環境は yarn 1.9.4 npm でも大きくは変わらないものと思われます。


前提

なぜ yarn.lock が必要か。

より正確に依存を記述して再現性を担保するためです。

yarn.lock

ではなぜ package.json でそれが担保できないか

^, ~ というバージョン指定に振れ幅があるからです。

semver

この前提を知っていれば意図せず yarn.lock が更新されているという疑問にはならないだろうと思うので補足です。

この semver というバージョニングの手法は軽微なバグ修正によって、引き起こる変更を取り込みやすくするという意図のもので個人的にはポジティブです。一人で開発するならこれを利用して開発するだろうと思います。

一方 Git による共同開発の場面では、これによっていらぬコンフリが起こってしまうこともあります。これを防ぐために バージョニングを固定する方法を記します。

[追記 2019/2/12]

yarn は yarn.lock のコンフリクトを解消する機能を持っています。

以下の内容ではなく、ベストなのはこの機能を使うことだと思われます。

https://code.fb.com/developer-tools/announcing-yarn-1-0/

一応内容は残しておきます。


作業

$ cd ${cwd}

$ touch ./.yarnrc`
$ echo "save-prefix """ >> ./.yarnrc`

あとすでに記述されている packge.json も当然編集が必要です。

一応公式にはこれで .yarnrc を追加できるような物言いをしているんですが、私はできませんでした。書いてはおきます。

自分はこの issue の手順通りやったまでです。

https://github.com/yarnpkg/yarn/issues/3045 

$ yarn config set save-prefix false

また .yarnrc の内容も

save-prefix false

と書いても良さそうだったのですが false がなぜか文字列として認識されてしまって false1.0.0 みたいなことになってしまいます。😔


注意

node modules のバージョンアップを恐れない姿勢でないならば、こういう運用はオススメはできません。おそらく npm の場合 2 年程度放置するだけでバージョンアップに追いつけないものになってしまう可能性があるからです。ある程度バージョニングにバッファを持たせて細かくエラーに対処する方が気にしなくてよくて持続的でしょう。

とはいえ yarn が適宜 deprecated になった api などを警告してくれるので、きちんとそれを解決しておけば大きな問題にはならないだろうと思っています。

以上


追記

yarn install で 自動でコンフリクトを解消してくれる機能があります。yarn を使っている場合はそちらの機能を使ってコンフリクトを解消した方がいいでしょう。