2017年5月13日土曜日

Could not get unknown property 'assembleRelease' for project ':app' of type org.gradle.api.Project.

経緯

Android Plugin for Gradle をバージョンアップ (*1) したところ、これまで通っていたビルドスクリプトが掲題のエラーを出力するようになってしまった。(Sync が通らない)

どうやら、assembleRelease の定義タイミングが変わった(後回しになった)ようである。

build.gradle (Module: app)
assembleRelease << {
  println 'after assembleRelease'
}
Error:(99, 0) Could not get unknown property 'assembleRelease' for project ':app' of type org.gradle.api.Project.

*1 Stack Overflow の question 39590549 によると、プラグインのバージョン 「2.1.3」と「2.2.0」との間で、当該挙動に変更があった模様。


解決方法 その1

assembleRelease が定義された後のコールバック内で、必要な処理を追加する。
※Android Plugin for Gradle の バージョン 2.3.1 (w/ Gradle 3.3) で動作確認済

tasks.whenTaskAdded { task ->
  if (task.name == 'assembleRelease') {
      task.doLast {
        println 'after assembleRelease'
      }
  }
}

解決方法 その2

ビルドスクリプトが一通り評価された後に、必要な処理を追加する。
※Android Plugin for Gradle の バージョン 2.3.1 (w/ Gradle 3.3) で動作確認済

afterEvaluate {
  assembleRelease.doLast {
    println 'after assembleRelease'
  }
}

素朴な疑問

Q.
task.doLast」や「assembleRelease.doLast」の部分を、これまで通り
task <<」や「assembleRelease <<」と書いたらだめなのか?

A.
だめではない (= 現状、正常動作する) が、推奨されない。今後は「doLast」を使っていくべき。
理由: 左シフト演算子「<<」 (Task.leftShift(Closure)) は、Gradle のバージョン 5.0 で廃止される予定のため。

The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.

0 件のコメント :

コメントを投稿