yarn.lockのconflict解消方法


yarnでJSライブラリのパッケージ管理を行っている場合、
しばしばbranch間でconflictする場合があると思います。

dependabotなどでライブラリのバージョンアップをしたり、githubの脆弱性チェックなどで
yarn.lockを直接書き換えたりした場合などに発生したりします。

ただし、その場合でも手動でyarn.lockを編集することは非推奨となっています。
(yarn.lock自体に正確なパッケージの依存関係が記載されているため、直接編集すると簡単に壊れる)

yarn.lockのconflictを解消する

詳細は下記記事を参考にしてください
https://www.jakewiesler.com/blog/merge-conflicts-in-yarn-lock/

作業前にmasterを最新にしている前提です。
masterから派生したコンフリクトしているブランチで次のような作業を行うことで解消できます。

$ git rebase master
# ①masterブランチのyarn.lockにあわせる
$ git checkout master -- yarn.lock
# ②その後そのブランチの依存関係を解決(パッケージの再インストール)
$ yarn install
# ③rebaseを続ける
$ git add yarn.lock
$ git rebase --continue
# 再度conflictした場合は上の①②を行い、③を行う
FIN

yarn.lockを直接編集する(脆弱性などの暫定対応)

ライブラリが参照している内部ライブラリが脆弱性があり、それに対してバージョンを上げたい場合があります。
その場合は手動でyarn.lock内の該当の依存ライブラリ部分を削除して再度yarn installします。

参考:
https://github.com/yarnpkg/yarn/issues/4986#issuecomment-395036563

例えば、package.jsonに記載されているjsonwebtoken(明示的な依存)が暗黙的に内部依存しているjws^3.0.0を脆弱なjws=3.1.4で解決している場合、代わりにパッチを適用したjws=3.1.5にアップグレードする必要があります。

yarn.lock内の下記のようなjwsのエントリを削除して再度yarnし直します。
そうすると間接的な依存関係と影響を受けるパッケージは、他のものに触れることなく更新されます(yarn v1.3以降で動作)

jws@^3.0.0, jws@^3.1.4:
  version "3.1.4"
  resolved "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2"
  dependencies:
    base64url "^2.0.0"
    jwa "^1.1.4"
    safe-buffer "^5.0.1"