2017-08-14 1 views
2

私は簡単なのGradleスクリプト(私のGradleのタスクが実行されたときだけログに記録する)Gradle 3.0.0(Androidスタジオ3.0で)タスクシーケンスを並べ替える(Kotlinモジュールでコンパイルするとき)?

class TestScriptTask extends DefaultTask { 
     @TaskAction 
     def testScript() { 
      logger.quiet("My Gradle Task Here") 
     } 
    } 

    project(":app") { 
     task testScript(type: TestScriptTask) { 
     } 
    } 

を持っていると私はKotlinにおけるモジュール「remotelib」に依存している簡単なAndroidのプロジェクト、「アプリ」を持っています。

マイアプリのbuild.gradleの依存関係

私は

./gradlew :app:assembleRelease :app:testScript 

以下のように私のGradleタスクを実行するときに、スクリプトが以下のように実行され

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile project(':remotelib') 
    // and others 
} 

以下のように(ここでは、タスクの点に注意してください。最初に実行されます)

> Task :app:testScript 
My Gradle Task Here 

> Task :remotelib:compileReleaseKotlin 
Using kotlin incremental compilation 

これは、'com.android.tools.build:gradle:3.0.0-beta1'(およびbeta2)。

私は'com.android.tools.build:gradle:2.3.2'にあったとき、すなわち

> Task :remotelib:compileReleaseKotlin 
Using kotlin incremental compilation 

> Task :app:testScript 
My Gradle Task Here 

予想通り、シーケンスは、大丈夫ですが、これはGradleの3.0.0のバグ、またはタスクの順序を処理する新しい方法ですか?

更新

buildscript { 
    ext.kotlin_version = '1.1.2-4' 
    repositories { 
     google() 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:3.0.0-beta1' 
     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 
     } 
} 

apply from: 'test_script.gradle' 


allprojects { 
    repositories { 
     google() 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 

} 
+0

Android Gradleプラグイン3.0には多くの変更があります。0とそのKotlinプラグインとの相互運用が可能になり、変更にはタスクの注文に影響を与えるものも含まれる可能性があります。しかし、あなたの例では、あなたの ':app:testScript'タスクは' remotelib'のKotlinコンパイルに依存している(少なくともここに掲載されたコードでは)指定していません。これは、 'dependsOn'関係か' test'タスクの入力として 'app'の' compile'設定を使うことで行うことができます。それ以外の場合、これらの2つのタスク間の実行順序は未定義であり、それらは任意の順序で実行できます。 – hotkey

+0

ありがとう@hotkey。 ':app:testScriptタスクはremotelibのKotlinコンパイルに依存していますか?'ありがとう。 – Elye

+0

ようこそ。私はそれが答えの中でどのように行われるのかを記述しました。 – hotkey

答えて

1

アンドロイドのGradleプラグイン3.0.0およびKotlinプラグインとの相互運用の変更、および変更の多くがあります以下のように私のプロジェクトの広いbuild.gradleタスクの順序付けに影響を与えるものも含まれます。

ただし、あなたの例では、あなたの:app:testScriptタスクが:remotelibのKotlinコンパイルに依存している(少なくともここに掲載されたコードでは)指定していません。したがって、これらの2つのタスク間の実行順序は未定義であり、それらは任意の順序で実行できます。

これは、次のいずれかによって行うことができる:あなたがappの依存関係にcompile project(':remotelib')を追加したのでtestScriptを作り、

  • testScript.dependsOn configurations.compile

    また、デフォルトのビルドをトリガーしますconfigurations.compileに依存します構成:remotelibのプロジェクトで、Kotlinもコンパイルします。

  • testScript.dependsOn project(':remotelib').compileKotlin

    これは、明示的にタスクが:remotelib:compileKotlinに依存しますが、それは(あなたがあなたの:appのビルドスクリプトにevaluationDependsOn ':remotelib'の行を追加する必要があるかもしれません):app前に評価されるように:remotelibが必要であることを指定します。

+0

上記の 'TestScriptTask'はすべて' test_script.gradle'ファイル内にあります。そして、 'build.gradle'プロジェクトでは、' apply from: 'test_script.gradle''を呼び出します。私はあなたの提案 'testScript.dependsOn configurations.compile'をアプリケーション' build.gradle'または 'test_script.gradle'でも適用しようとしますが、エラーは続いています。上記のスクリプトをどこに置くべきですか? – Elye

+0

@Elye、あなたは何を得ていますか?基本的には、私が答えて提案したいずれの解決策も 'testScript'タスクが作成された後*適用されるべきです。つまり、 'build.gradle'で' apply from:... 'の後か、' test_script.gradle'のタスク定義の後です。 – hotkey

+0

このエラーが発生しました 'ルート・プロジェクト 'MyApplication'(タイプorg.gradle.api.Project.)の不明なプロパティ 'testScript'を取得できませんでした' apply: 'test_script.gradle''の行の直後に上記の私の更新に示されています。 – Elye

関連する問題