私はすべてがうまく構築された、非常に良いgradle構成を持っていました。しかし、他のプロジェクトから派生したマルチプロジェクトビルドのプロジェクトの1つは、他のgitリポジトリに喜んで移動し、それを処理するためにサブモジュールを構成します。
最初に、ProjectとそのリソースをサブフォルダーLibraries/MovedProject
に移動しました。 gradle構成でいくつかの行を変更した後、正常に機能しました。しかし、このプロジェクトのためだけに新しいbuild.gradleを作成し、すべての構成をメインの構成からそこに移動することにしました。
そして、ここですべてが機能しなくなりました。タスクを呼び出そうとすると、常にCould not find property 'sourceSets' on project ':Libraries/MovedProject'
で終わります。それを担当する行は次のとおりです。
dependencies {
...
if (noEclipseTask) {
testCompile project(':Libraries/MovedLibrary').sourceSets.test.output
}
}
他のプロジェクトのクラスを使用するテストの実行に使用します。その行を削除すると、MovedProjectを使用するプロジェクトのcompileTestJavaタスクに到達したときにのみビルドが失敗します。その行を削除してgradle :Libraries/MovedLibrary:properties
を呼び出すと、次のように表示されます。
...
sourceCompatibility: 1.7
sourceSets: [source set main, source set test]
standardOutputCapture: org.gradle.logging.internal.DefaultLoggingManager@1e263938
...
gradle :Libraries/MovedLibrary:build
は正しくビルドされます。
現在、私はすべてを次のように設定しています:
ディレクトリ:
settings.gradle
include Libraries/MovedProject,
SomeMainProject1,
SomeMainProject2,
SomeMainProject3
movedProjectのsourceSetsはLibraries/MovedProject/project.gradle
で定義されています:
sourceSets {
main {
Java {
srcDir 'src'
srcDir 'resources'
}
resources { srcDir 'resources' }
}
test { Java {
srcDir 'test/unit'
} }
}
sourceSets.test.outputを使用する依存関係はBuilder/dependancies.gradle
に保存され、テストを実行するためにMovedProjectを必要とする各プロジェクトに設定されます。
project(':SomeMainProject1') {
dependencies {
...
if (noEclipseTask) {
testCompile project(':Libraries/net.jsdpu').sourceSets.test.output
}
}
}
そのエラーを取り除き、現在のディレクトリ構造でgradleビルドプロジェクトを作成する最も簡単な方法は何ですか? gradleがそのプロパティを見ることができない理由を理解したいと思います。
問題の行は、プロジェクト_:Libraries/MovedLibrary
_が現在のプロジェクトの前にevaluated(実行されていない)であると仮定するため、問題があります。そうです。そうでない場合、他のプロジェクトのソースセットはまだ構成されていません。 (_Java-base
_プラグインがまだ適用されていないため、sourceSets
プロパティさえありません。)
一般に、特に現在のプロジェクトの子ではない場合、他のプロジェクトのプロジェクトモデルに手を差し伸べないことが最善です。プロジェクトBのテストコードを使用するプロジェクトAの場合、推奨される解決策は、プロジェクトBがテストJarを(_artifacts {}
_ブロックを介して)公開し、プロジェクトAがそれを使用することです。
現状を維持したい場合は、_gradle.projectsEvaluated {}
_またはproject.evaluationDependsOn()
を使用して問題を回避できる場合があります。詳細については、 Gradle Build Language Reference を参照してください。