依存パッケージの管理
依存パッケージの追加
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のバージョンによって、手順が変わってくるので、詳細は公式に公開されている内容を参照してアップデートを実行するようにしてください。