Gradle 3.1の複合ビルドでバイナリ依存関係を取り除く

Gradleの登場以来、アセンブリをコンポーネントに分割する方法は2つありました。バイナリ依存関係を使用する方法とマルチプロジェクトビルドを使用する方法です。 これらの方法にはそれぞれ長所と短所があります。 バイナリ依存関係の場合、アーティファクトを公開する必要が生じ、アセンブリが複雑になります。 マルチプロジェクトアセンブリを使用する場合は
コンポーネントを互いに分離するのがより困難です。


複合アセンブリ


Gradleの次のリリース3.1では、複数のコンポーネントで構成されるアセンブリを整理するための新しいアプローチ、 複合アセンブリorig。Composite Builds)が表示されます。


複合アセンブリを使用すると、次のことができます。




新しい機能を使用する簡単な例を見てみましょう。


これを行うには、単純な投影を作成します。


 --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 runappを起動しようとすると、未解決の依存関係が宣誓されます。


 $ ./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') } 

まだ機能しないものは何ですか?



チーム計画



使用材料




Source: https://habr.com/ru/post/J309938/


All Articles