Gradleの登場以来、アセンブリをコンポーネントに分割する方法は2つありました。バイナリ依存関係を使用する方法とマルチプロジェクトビルドを使用する方法です。 これらの方法にはそれぞれ長所と短所があります。 バイナリ依存関係の場合、アーティファクトを公開する必要が生じ、アセンブリが複雑になります。 マルチプロジェクトアセンブリを使用する場合は
コンポーネントを互いに分離するのがより困難です。
複合アセンブリ
Gradleの次のリリース3.1では、複数のコンポーネントで構成されるアセンブリを整理するための新しいアプローチ、 複合アセンブリ ( orig。Composite Builds)が表示されます。
複合アセンブリを使用すると、次のことができます。
- ライブラリソースの修正バージョンを別のプロジェクトにすばやく配置し、アセンブリを作成、公開、編集する必要はありません。
- 大きなプロジェクトをいくつかの小さな分離されたアセンブリに分割し、各アセンブリで個別にまたは同時に作業することができます。
- ビルドシステムのプラグインの開発を、それを使用するプロジェクトから分離します(
buildSrc
アナログ)
新しい機能を使用する簡単な例を見てみましょう。
これを行うには、単純な投影を作成します。
--app/ |-src/main/java/Main.java |-build.gradle - lib/ |-src/main/java/A.java |-build.gradle |-settings.gradle
lib / build.gradle:
apply plugin: 'java' group "ru.shadam" version "1.0" task wrapper(type: Wrapper) { gradleVersion = '3.1-rc-1' }
app / build.gradle
apply plugin: 'java' apply plugin: 'application' mainClassName='Main' dependencies { compile 'ru.shadam:lib1:1.0' } task wrapper(type: Wrapper) { gradleVersion = '3.1-rc-1' }
ここで、。 ./gradlew run
Gradleコマンドを./gradlew run
てapp
を起動しようとすると、未解決の依存関係が宣誓されます。
$ ./gradlew run :compileJava FAILURE: Build failed with an exception. * What went wrong: Could not resolve all dependencies for configuration ':compileClasspath'. > Cannot resolve external dependency ru.shadam:lib1:1.0 because no repositories are defined. Required by: project : * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 1.027 secs
ただし、新しいフラグ-include-buildを追加すると、Gradleは依存関係を自動的に解決します。
$ ./gradlew run --include-build ../lib1 [composite-build] Configuring build: C:\Users\sala\projects\gradle-compose\lib1 :compileJava :lib1:compileJava UP-TO-DATE :lib1:processResources UP-TO-DATE :lib1:classes UP-TO-DATE :lib1:jar UP-TO-DATE :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :run Hello BUILD SUCCESSFUL Total time: 1.092 secs
高度なユースケース。
スクリプトに--include-buildを埋め込みます
上記のオプションは、単回使用により適しています-ここと今。 フラグを毎回指定する必要はありません-ラッパーに縫い付けても。
このため、gradleはsettings.gradleを使用した構成の使用を提案しています。 したがって、上記のフラグは次のsettings.gradleに置き換えることができます。
includeBuild('../lib1')
ルックアップ
含めたいプロジェクトが成果物の座標を指定していない場合はどうなりますか? (グループ、バージョン)
代替が助けになります:
includeBuild('../lib1') { dependencySubstitution { substitute('ru.shadam:lib1') with project(':') } }
この機能により、 ru.shadam:lib1
依存関係をlib1
プロジェクトへの依存関係に置き換えることができます。
タスク間の依存関係
複合アセンブリの場合、プロジェクトは互いに分離されているため、アセンブリ間の依存関係を直接宣言することはできません。
これに関して、含まれているアセンブリにアクセスするための新しい構文が登場しました。 たとえば、含まれるアセンブリのタスクへの依存を決定できます。
task run { dependsOn gradle.includedBuild('lib1').task(':jar') }
まだ機能しないものは何ですか?
- デフォルトの構成と一致しない成果物を公開したプロジェクトは、含まれるプロジェクトとしてサポートされません。 参照
- IDEにはまだサポートがありません(ただし、。
./gradlew idea
コマンドを使用したプロジェクトの生成は./gradlew idea
) - ネイティブビルドはサポートされていません。
チーム計画
- 含まれているアセンブリからタスクを直接呼び出す機能を追加します。
- 含まれているビルドを並行して実行する機能を追加します
-
-t
フラグを使用する場合、含まれるアセンブリに変更検出を追加します。 - 暗黙のbuildSrcプロジェクトを組み込みビルドにします。