2016-07-27 10 views
1

私はGradle 2.14.1とhttps://github.com/unbroken-dome/gradle-testsets-pluginを使って統合テストタスクを追加しています。私はHTMLレポートの場所を設定したいと思います。 デフォルトのタスクが使用しています:その後に追加されたタスクの `tasks.withType()`奇妙な動作

<project>/build/reports/tests 

をtestsetsプラグインは設定しています。intTestタスクの

<project>/build/intTest 

を、そして私がしたい:ここ

<project>/build/reports/test 
<project>/build/reports/intTest 

は私の設定です:

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:1.2.0' 
    } 
} 

apply plugin: 'java' 
apply plugin: 'org.unbroken-dome.test-sets' 

defaultTasks = ['clean', 'build'] 

tasks.withType(Test) { 
    reports.html.destination = new File(project.reportsDir, name) 

    println(it.name + '\t' + reports.html.destination) 
} 

task wrapper(type: Wrapper) { 
    description = 'Defines the common gradle distribution for this project.' 
    gradleVersion = '2.14.1' 
} 

testSets { 
    intTest 
} 

intTest.dependsOn test 
check.dependsOn intTest 

repositories { 
    jcenter() 
} 

dependencies { 
    testCompile 'junit:junit:4.12' 
    intTestCompile 'junit:junit:4.12' 
} 

println('===== final config =====') 
println(test.name + '\t' + test.reports.html.destination) 
println(intTest.name + '\t' + intTest.reports.html.destination) 

(当面println文を無視してください。)

をフルビルドした後、intTestタスクのレポートは、間違った場所(デフォルト)であり、かつ標準testタスクの設定が適用されます。

$ ls build/ 
classes dependency-cache intTest intTest-results libs reports test-results tmp 

$ ls build/reports/ 
test 

(プロジェクトのルートは、「ブロブ」です)私が起こっているかを確認するためにいくつかの出力を追加し、それは奇妙なよう:

test /home/wujek/blob/build/reports/test 
intTest /home/wujek/blob/build/reports/intTest 
===== final config ===== 
test /home/wujek/blob/build/reports/test 
intTest /home/wujek/blob/build/intTest 

ので、tasks.withType()ブロックトンに彼の位置は正しいと報告されていますが、結局はそうではありません。

このプロジェクトのtestSetsブロック工事後tasks.withType()ブロックを移動することに注意してください、私の本当の設定は、モード複雑ですしてください:私はmutlipleのモジュールがあり、根build.gradleは、レポートの場所を設定するには、tasks.withType()ブロックでsubprojectsブロックを使用していますサブモジュールの1つが新しいテストセットを追加し、そのテストタスクのHTMLレポートの位置が間違っています。これを修正するには、テストセットを追加するサブモジュールで設定を繰り返す必要があります。

ここでは何が起こっていますか?なぜtasks.withType()ブロックはconfigが動作すると言っているのですか?実際にはありませんか?

答えて

1

これは、Gradleの注文設定の特殊性によるものです。 Gradleのは(関連していない行をスキップ)何が起こるかを見るために、それを処理してのは、あなたのコードを見てみましょう:

apply plugin: 'org.unbroken-dome.test-sets' 

これはthe creation of a class which listens for test sets to be addedを含むテスト・セットのプラグインの適用方法を実行します。 It adds a whenObjectAdded actiontestSetsコンテナ。まだテストセットを追加していないので、build.gradleに戻ってください。

tasks.withType(Test) { 
    reports.html.destination = new File(project.reportsDir, name) 

    println(it.name + '\t' + reports.html.destination) 
} 

あなたは今、彼らが作成されると、すべての既存のTestタスクに、新しいものに適用するアクションを追加しました。今どこにすべての巻き戻し:

testSets { 
    intTest 
} 

これはintTestと呼ばれるtestSetを作成します。今プラグインのテスト・セットでwhenObjectAddedアクションが発動:

  1. intTestセットのテストタスクis createdを。
  2. 新しいTestタスクが追加されましたので、あなたのwithTypeアクションが発生します。これにより、必要な場所にレポートが設定されます。
  3. whenObjectAddedアクションが今でも続行され、ちょうど設定したものを上書きして、htmlレポートの場所も設定するthis lineになります。

あなたがtestSetを宣言するために、これを変更は最初それが行く:

  1. whenObjectAdded - テストタスク
  2. whenObjectAdded作成 - テスト・タスクのHTMLレポートの場所
  3. withTypeの設定を自分で登録されています
  4. withType希望する宛先にHTMLレポートの場所を設定します。

これを避けるための厳密なルールはありません。プラグインは設定アクションを登録する方法とタイミングを大きく異ならせることができます。

    1. Buildscriptブロック(必要な場合)
    2. プラグイン
    3. セットプロジェクトレベルのプロパティ(グループ、バージョン、sourceCompatibility、など)
    4. を適用:一般的に、私はこの順序でダウン私のbuild.gradleを破るしよう通常
    5. 設定の拡張(sourceSets、testSets、構成、依存関係)
    6. 設定タスク(直接またはwithTypeのいずれか)

    これは設定を起動するプラグインが設定を変更する前にデフォルト値を登録できるようにします。

    FYI Gradle's new, and still incubating, model spaceは、この構成の問題を解決するためのものです。それは完璧ではありませんが、より明示的にすることができます。

  • +0

    あなたの説明に基づいて、私は問題を修正することができました。私のセットアップは次のとおりです。メインbuild.gradleのsubprojectsブロックにtestSetsプラグインとwithType()ブロックがありました。 testSets {intTest}ブロックはサブモジュールに追加されます。サブモジュールはその後にのみ評価されます(したがって間違った設定)。ですから、あなたが提案したように注文するためには、サブプロジェクト{}ブロックにafterEvaluate {}ブロックを追加し、すべてのtasks.withType呼び出しがそこにあります。それは意味があります:すべてのサブプロジェクトが評価された後(そのプラグインがタスクを追加した後など)、メインビルドはそれらを集中的に構成します。 – wujek

    +0

    ええ、その場合にはもう少し制限がありますし、afterEvaluateがおそらく最良の選択肢だと思います。 – ajoberstar

    関連する問題