web-dev-qa-db-ja.com

Gradle multiprojectで「プロジェクトでプロパティ 'sourceSets'が見つかりませんでした」エラーが発生する

私はすべてがうまく構築された、非常に良い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は正しくビルドされます。

現在、私はすべてを次のように設定しています:

  1. ディレクトリ:

    • / SomeMainProject1
    • / SomeMainProject2
    • / SomeMainProject3
    • /ライブラリ
      • /MovedProject
        • build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /ビルダー
      • dependencies.gradle
      • project.gradle
      • tasks.gradle
    • build.gradle
    • settings.gradle
  2. settings.gradle

    include Libraries/MovedProject,
            SomeMainProject1,
            SomeMainProject2,
            SomeMainProject3
    
  3. movedProjectのsourceSetsはLibraries/MovedProject/project.gradleで定義されています:

    sourceSets {
        main {
            Java {
                srcDir 'src'
                srcDir 'resources'
            }
            resources { srcDir 'resources' }
        }
        test { Java {
            srcDir 'test/unit'
        } }
    }
    
  4. sourceSets.test.outputを使用する依存関係はBuilder/dependancies.gradleに保存され、テストを実行するためにMovedProjectを必要とする各プロジェクトに設定されます。

    project(':SomeMainProject1') {
        dependencies {
            ...
    
            if (noEclipseTask) {
                testCompile project(':Libraries/net.jsdpu').sourceSets.test.output
            }
        }
    }
    

そのエラーを取り除き、現在のディレクトリ構造でgradleビルドプロジェクトを作成する最も簡単な方法は何ですか? gradleがそのプロパティを見ることができない理由を理解したいと思います。

21

問題の行は、プロジェクト_:Libraries/MovedLibrary_が現在のプロジェクトの前にevaluated(実行されていない)であると仮定するため、問題があります。そうです。そうでない場合、他のプロジェクトのソースセットはまだ構成されていません。 (_Java-base_プラグインがまだ適用されていないため、sourceSetsプロパティさえありません。)

一般に、特に現在のプロジェクトの子ではない場合、他のプロジェクトのプロジェクトモデルに手を差し伸べないことが最善です。プロジェクトBのテストコードを使用するプロジェクトAの場合、推奨される解決策は、プロジェクトBがテストJarを(_artifacts {}_ブロックを介して)公開し、プロジェクトAがそれを使用することです。

現状を維持したい場合は、_gradle.projectsEvaluated {}_またはproject.evaluationDependsOn()を使用して問題を回避できる場合があります。詳細については、 Gradle Build Language Reference を参照してください。

20