依存パッケージの管理
依存パッケージの追加
package.jsonとPodfile.lockへの追加
次の2つのコマンドをセットで実行してください。
npx expo install <package-name>devDependenciesに追加する場合は、npx expo install <package-name> -- -D- 上の方法で
dependenciesに追加されてしまった場合は、該当パッケージをpackage.jsonのdependenciesからdevDependenciesへ移動してください。その後、npm install
npm run pod-install
macOSでないとpod-installは実行できないので、依存ライブラリはできるだけmacOSで追加するようにしてください。
ただし、Podを利用していないとわかっているライブラリを追加するのであれば、macOSでなくても問題ありません。
ExpoはReactなど一部の依存パッケージについて、利用できるバージョンを管理しています。そういったライブラリについては、個別に自分たちで依存ライブラリのバージョンを管理する必要はありません。npx expo installでインストールすれば、適切なバージョンがインストールされます。
一方で、npm install <package-name>でインストールするだけでは正しいバージョンでインストールされない可能性があるということに注意してください。
依存パッケージをdependenciesに追加する場合は、必ずnpx expo installでインストールしてください。
ただし、Expo SDKと互換性のある依存パッケージをdevDependenciesに追加しようとすると、dependenciesに追加されてしまいます。
その場合、依存パッケージをpackage.jsonのdependenciesからdevDependenciesへ移動してください。その後、npm installでpackage-lock.jsonを更新する必要があります。
Renovateの設定を追加
依存パッケージの分類とバージョン範囲を確認して、追加したパッケージを適切な分類にあてはめてください。
他のパッケージとまとめてアップデートする必要がなければ、設定の追加は必要ありません。package.jsonで指定するバージョン範囲(~や^など)は、追加したパッケージの種類に応じて修正してください。
依存パッケージの分類とバージョン範囲
依存パッケージのバージョン管理にあたって、まず「expo upgradeの対象になるか」を確認します。そのうえで、指定するバージョン範囲をどう指定するかを決める必要があります。
このアプリでは次のように設計しています。具体的な分類については、renovate.json5を参照してください。
expo upgradeに含まれるパッケージ
バージョン範囲は expo upgrade で自動的に設定されるものを採用します。ここに該当するパッケージは、expo installとexpo upgradeで設定されるバージョンから変更しません。
expo upgradeに含まれるパッケージへの依存があるパッケージ
依存するパッケージのバージョン範囲と整合するように設定します。詳細はパッケージごとに検討する必要があります。
Expoと関連がないパッケージ(上記に該当しないパッケージ)
このアプリでは、これらのパッケージは大きく3つに分類しています。
- React Navigation、Docusaurusなどの、バージョンをまとめて管理したいパッケージ
- まとめて管理したいパッケージごとに
renovate.json5でグループを定義
- まとめて管理したいパッケージごとに
- ESLintやPrettierなどの、ツール系パッケージ
renovate.json5のツール系パッケージ用グループに追加
- 個別にバージョンを管理するパッケージ
- 個別にバージョンを管理する場合、
renovate.json5での設定は不要
- 個別にバージョンを管理する場合、
これらのパッケージは、バージョン範囲を次のルールで設定しています。
dependencies: パッチバージョン (~1.1.0)devDependencies: マイナーバージョン (^1.1.0)
dependenciesは、パッチバージョンまではバージョン範囲内のアップデートでまとめてアップデートされます。マイナーバージョンのアップデートにはパッケージごとにバージョン範囲外へのアップデートが必要です。依存パッケージのメンテナンスを容易にするため、devDependenciesはマイナーバージョンまではバージョン範囲内のアップデートでまとめてアップデートします。
@typesのバージョンについて
@typesのバージョン範囲を指定するのはとても難しいです。このアプリでは、できるかぎり元パッケージの範囲指定に合うように設定しています。
元パッケージと同じバージョンもしくは、より新しいバージョンの@typesパッケージがあるとは限らないので、元パッケージと同じバージョン範囲は指定できません。たとえば、Reactのバージョンが16.13.1だとしても@types/reactには16.9.xしか存在しないため、@types/reactのバージョンとして~16.13.1は指定できません。
このようなときにもできるだけ適切なバージョンの@typesをインストールするために、@typesのバージョン範囲指定には^や~ではなく、不等号(<)を利用しています。なお、expo upgradeに含まれるパッケージはこのルールには含めません。
- 例:
jest- ▶
jest-expoでは、jestのバージョンを^25.2.0と指定している(expo 41.0.0時点) - ▶
@types/jestはメジャーバージョンが25なら問題ないとして、"@types/jest": "<26.0.0"と指定する
- ▶
- 例:
react-test-renderer- ▶
jest-expoでは、react-test-rendererのバージョンを~16.11.0と指定している(expo 41.0.0時点) - ▶
@types/react-test-rendererはマイナーバージョンが11なら問題ないとして、"@types/react-test-renderer": "<16.12.0"と指定する
- ▶
依存パッケージのアップデート
package.jsonで指定したバージョン範囲内でのアップデートかバージョン範囲外へのアップデートかによって、依存パッケージをアップデートする手順が異なります。
バージョン範囲内のアップデート
パッケージ個別にはアップデートせず、全体をまとめてアップデートします。package-lock.jsonを削除してnpm installを実行してください。
このアップデートは、RenovateのlockFileMaintenanceで自動的にプルリクエストが作成されます。
Podを含むパッケージがアップデートされた場合、npm run pod-installを実行してPodfile.lockを更新する必要があります。
Windowsで依存パッケージをインストールしたときに、fseventsなどmacOSのみで利用される依存パッケージの依存関係が破損してしまうことがあるようです。破損してしまった場合、macOSでnpm ciを実行するとエラーになって依存パッケージをインストールできなくなってしまいます。
このような問題があったため、依存パッケージのアップデートはmacOSで実施するようにしています。
バージョン範囲外へのアップデート
パッケージ個別にアップデートします。package.jsonに書かれているバージョンを更新して、npm installを実行してください。
基本的にはRenovateで自動的にプルリクエストが作成されます。ただし、Expo SDKなどRenovate対象外としているパッケージについては、手動でアップデート作業が必要です。
Podを含むパッケージがアップデートされた場合、npm run pod-installを実行してPodfile.lockを更新する必要があります。
Expoのアップデート
Expoのアップデートには、expo upgradeコマンドを利用します。expo upgradeでアップデートするとpackage.jsonとpackage-lock.jsonが更新されます。
基本的にはPodも更新されるので、expo upgradeを実行した後はnpm run pod-installを実行するようにしてください。
アップデートするExpoのバージョンによって、手順が変わってくるので、詳細は公式に公開されている内容を参照してアップデートを実行するようにしてください。