https://d226lax1qjow5r.cloudfront.net/blog/blogposts/the-right-way-of-using-gradle-dynamic-dependencies/blog_gradle-dynamic-dependencies_1200x600.png

Gradle動的依存関係の正しい使い方

最終更新日 November 4, 2020

所要時間:4 分

この記事は2025年4月に更新されました。

Gradleは、Android開発やその他のJavaベースのプロジェクトで広く使われている、強力で柔軟なビルドシステムです。依存関係管理を提供し、アプリケーションが依存する外部ライブラリやフレームワークを定義できる。

Gradleで依存関係を定義する

通常、Gradleではこのように依存関係を定義する:

dependencies {

    implementation 'com.vonage.client:client-sdk:2.7.0'

}

上記の例では、Gradleは特定のバージョンの 2.7.0の特定のバージョンをダウンロードします。 Vonage Client SDK の特定のバージョンをダウンロードします。.しかし、Gradle にライブラリのバージョンを動的に管理させたい場合、固定バージョン番号を指定する代わりに動的バージョンを使用することができます。

セマンティック・バージョニングを理解する

今日のほとんどのライブラリは セマンティック・バージョニング(semver)に従っている。 major.minor.patchフォーマット(例えば 2.7.0).バージョニングのルールは以下の通りである:

  • メジャー:APIに後方互換性のない変更(例:メソッドシグネチャの変更)があった場合にインクリメントされる。

  • マイナー:後方互換性のある方法で新機能が追加された場合に増加する(新しいメソッドの追加など)。

  • パッチ:後方互換性のあるバグ修正(例えば、新機能を導入せずにバグを修正する)のために増量される。

動的依存関係の使用

Gradle では動的バージョン管理を使用することができ、依存関係の互換性のある最新バージョンを自動的に取得することができます。ここでは動的バージョンを定義する方法を説明します:

dependencies {

    implementation 'com.vonage.client:client-sdk:2.7.+'

}

上記の例では、Gradleは最新のパッチバージョンの 2.7.x(例えば 2.7.1, 2.7.2).など、他の形式の動的依存関係を使うこともできます:

  • implementation 'com.vonage.client:client-sdk:2.+':これは 2.xの範囲内の最新バージョン(マイナー・バージョンとパッチ・バージョンの両方)を取得する。

  • implementation 'com.vonage.client:client-sdk:+':ライブラリの最新バージョンを取得します。

動的依存関係は、常に最新のバグフィックスや改良を使用するのに役立ちますが、いくつかの大きな注意点があります。

動的依存関係に注意すべき理由

動的な依存関係は、予測不可能な動作につながる可能性があります。以下は、動的依存関係が問題を引き起こす可能性のある問題やシナリオです。

問題のシナリオ1:一貫性のないビルド

あなたのアプリが1ヶ月前には問題なく動作していたのに、バグが発生してから期待通りに機能しなくなったとします。当時のリポジトリをチェックアウトし、アプリを再構築しましたが、問題はまだ続いています。何が起こったのでしょうか?

問題は、Gradleの動的依存メカニズムが外部ライブラリの最新バージョンをフェッチしたことです。あなたのソースコードが1ヶ月前のものだったにもかかわらず、外部ライブラリのバージョンはロックされていなかったため、最新バージョンがダウンロードされ、問題が発生しました。

レッスン1:動的依存関係を使ってアプリをリビルドすると、依存関係が時間とともに更新されるため信頼性が低くなり、アプリがビルドされた環境を正確に再現することが難しくなります。

問題のシナリオ2:ユーザーにとって予測不可能なバグ

もしあなたがライブラリーの作成者で、ユーザーにあなたのライブラリーのダイナミック・バージョンを使うように勧めている場合(例. com.vonage.client:client-sdk:2.7.+など)を使用することを推奨している場合、ユーザーは知らず知らずのうちに、ライブラリの新しいリリースで導入されたバグに遭遇するかもしれません。彼らはおそらく問題を報告するでしょうが、正確な原因はわからないままです。

レッスン:実稼働アプリケーションに動的依存関係を使うことをユーザーに勧めるのは避けましょう。バグの原因を特定するのは難しいかもしれませんし、ユーザは動作するバージョンに簡単に戻すことができないかもしれません。

依存関係を管理する最新ソリューション

動的な依存関係によって引き起こされる問題を軽減するために、最新のツールと戦略が利用できる:

1.Gradleのロック機能を使う

Gradleの組み込み依存関係ロックは、動的バージョニングを使用しているときでも依存関係のバージョンを制御することができます。これによって build.gradleファイル内のバージョン指定子は動的であっても、ビルド時に使用される実際のバージョンはロックされます。

を有効にする 依存関係ロックを有効にするには build.gradleファイルに追加する:

dependencyLocking {
    lockAllConfigurations()
}

次に、ロック・ファイルを生成するために、以下を実行する:

./gradlew dependencies --write-locks

生成された dependencies.lockファイルは、チーム全員が同じバージョンの依存関係を使うことを保証し、ビルドを決定論的にし、バグの可能性を減らします。

2.Gradle Dependency Lockプラグインを使う

より高度な機能を必要とするチームには gradle-versions-pluginプラグインを使うと、古い依存関係を追跡できます。以下のコマンドを実行してアップデートをチェックしてください:

./gradlew dependencyUpdates

次に、ロック・ファイルを生成するために、以下を実行する:

./gradlew dependencyUpdates

このコマンドは、プロジェクト内の古くなった依存関係をすべてリストアップしたレポートを生成します。大規模なプロジェクトでは、手作業でひとつひとつチェックしなくても、依存関係を最新に保つことができます。

3.特定のバージョンをstrictly

依存関係のどのバージョンが使われるかをきめ細かく制御する必要がある場合(動的バージョニングの場合でも)、Gradleの strictly機能を使います:

dependencies {
    implementation('com.vonage.client:client-sdk:2.7.+') {
        strictly '2.7.1'
    }
}

これにより、動的なバージョニングは可能になるが、バージョンは 2.7.1にロックし、新しいバージョンが予期せず使用されるのを防ぎます。

4.IDEの警告

最新のIDE のような最新のIDまたは Android Studioのような最新のIDEは、動的依存関係を使用するときに警告を表示するので、潜在的な問題が発生する前にそれをキャッチしやすくなります。また、依存関係のバージョンを更新したりロックしたりする簡単なアクションも提供されています。

依存関係管理のベストプラクティス

  1. 本番環境におけるバージョンの明示的定義:新しいライブラリのバージョンによる予期せぬ問題を避けるため、運用コードでは常に正確なバージョンを指定してください。

  2. 依存性ロックを使用する:依存関係を特定のバージョンでロックし、ビルドがすべての環境で再現できるようにします。

  3. ツールでアップデートを自動化:以下のようなツールの使用を検討してください。 Dependabotのようなツールを使うことを検討してください。これにより、手動で依存関係をチェックすることなく、アップデートを追跡することができます。

  4. 変更履歴:依存関係を更新する前に、変更履歴を確認し、変更点や新機能を確実に把握しましょう。

  5. 広範なテスト:動的な依存関係を使用する場合は、依存関係の変更によって発生する可能性のある問題を捕捉するために、適切なテストカバレッジがあることを確認してください。

結論

Gradleの動的依存関係は利便性を提供しますが、ビルドの一貫性の欠如や予測不可能なバグなどのリスクをもたらす可能性があります。Gradleの組み込みのロック機能、もしくは gradle-versions-plugin.本番アプリケーションでは、予期せぬ問題を回避し、再現性を確保するために正確なバージョンを指定することを推奨します。正しい戦略とツールを採用することで、依存関係を自信を持って管理し、ビルドを安定させることができます。

ご質問がある場合、またはあなたが作っているものを共有したい場合は、こちらをクリックしてください。

最新の開発者向けニュース、ヒント、イベント情報をお届けします。

シェア:

https://a.storyblok.com/f/270183/384x384/8ae5af43bb/igor-wojda.png
Igor Wojdaヴォネージの卒業生