Gradleでは、一般的なJavaプロジェクトレイアウト(src / main / java)ではなく、buildSrcファイルをトップレベルとして使用する目的は何ですか?
あなたは間違いなくこれを行うことができます。これはgradleの複合ビルドとして知られていますが、そのフォルダーからのビルドを含めるようにGradleに指示する必要があります。トップレベルフォルダーのユニークなプロパティbuildSrc
は、gradleがそれをインクルードビルドとして自動的に処理することです。
buildSrc
複合ビルドとして扱われていても、を実行すると、含まれているビルドのリストに表示されないことに注意してくださいgradle.getIncludedBuilds()
。その理由は、リストが手動でに含めたビルド用に予約されているためだと思いますsettings.gradle
。
複合ビルドとしても含めるにはsrc/main/java
、フラグを使用してgradleスクリプトを実行し--include-build
、その後にへのパスを続ける必要がありますsrc/main/java
。これは、含まれているビルドとしては珍しい場所ですが、gradleは文句を言いません。
そして、プロジェクト全体で共通の設定を定義するトップレベルのbuild.gradle(proj1およびproj2と同じレベル)がありますか?
、およびサブプロジェクトとbuild.gradle
同じレベルのトップレベルを持つことができます。これは通常、ほとんどのマルチプロジェクトプロジェクトの構造です。proj1
proj2
すでに強調した別の回答として、プロジェクトの目的は、ビルド内のさまざまなプロジェクト間でローカルに共有されることをbuildSrc
目的としたカスタムプラグインまたはタスクを作成することです。これは、トップレベルでこれらのカスタムタスクとプラグインを作成できないことを意味するものではありません。この方法でそれを行うことができますが、問題は、どのサブプロジェクトでもそれを使用できないことです。build.gradle
java / groovyに何かをインポートできるようにするには、それが適切なjava / groovyファイル(またはjava 9以降のモジュール)に存在する必要があることに注意してください。あなたbuild.gradle
は単なるスクリプトであるため、プラグインやタスクをそこからインポートすることは恣意的ではありません。
私がすでに指摘したように、これはGradleのドキュメントbuildSrc
からのものですが、ディレクトリを持つ理由の1つは次のとおりです。
ディレクトリが検出されると、Gradleはこのコードを自動的にコンパイルしてテストし、ビルドスクリプトのクラスパスに配置します。
ご覧のとおりbuildSrc
、プロジェクトのすべてのビルドスクリプトに機能を追加できるという点で、ビルドプロセスの拡張として機能します。
さらにいくつかのポイント:
dependencies
で宣言されたものはすべてbuildSrc/build.gradle
、プロジェクトの残りのビルドスクリプトに表示されます。
- あなたの
buildscript
ブロックは、他buildSrc/build.gradle
には何も見えbuildSrc/build.gradle
ません。
- で定義されたプラグインクラスは、プロジェクトのビルドスクリプトで
buildSrc
使用でき、で宣言する必要はありませんMETA-INF/gradle-plugins
。
- メイン
build.gradle
プロジェクトまたはサブプロジェクトで定義されている依存関係は、に表示されませんbuildSrc
。このフォルダーがインクルードビルド(つまり外部)として扱われることを覚えている場合は、それを含むプロジェクトのクラスパスを表示できない理由が理解できるはずです。