11

カスタムgradleプラグイン内では、project.versionは常にのようunspecifiedです。project.versionカスタムプラグイン(クラス)内を取得する理由と方法は?

例えば:

apply plugin: 'java'
apply plugin: MyPlugin

version = "1.0.0"

println "In build file: $project.version" 

class MyPlugin implements Plugin<Project> {
  public void apply(Project project) {
    project.task('myTask') {
      println "In plugin: $project.version"
    }
  }
}

プリントアウト:

%> gradle -q myTask
  In plugin: unspecified
  In build file: 1.0.0

どうやって本当に理由を知りたいのか?

4

3 に答える 3

11

呼び出した後にプロパティを設定しますapply

引っ越したら

version = "1.0.0"

行の前に

apply plugin: MyPlugin

動作するはずです

編集

ピーターの答えに続いて、これも機能することがわかります。

apply plugin: 'java'
apply plugin: MyPlugin

version = "1.0.0"

println "In build file: $project.version" 

class MyPlugin implements Plugin<Project> {
  public void apply(Project project) {
    project.task('myTask') {
      project.gradle.projectsEvaluated { 
        println "In plugin: $project.version"
      }
    }
  }
}

$project.versionビルドの評価が完了するまでの評価を遅らせるには

于 2012-11-02T15:38:30.887 に答える
6

プラグインを作成する際の課題は評価順序の処理であり、習得するにはある程度の知識と専門知識が必要です。

ビルドスクリプトでは、バージョンが設定される前にプラグインが適用される(したがって実行される)ことに注意してください。これは標準であり、プラグインはそれに対処する必要があります。大まかに言えば、プラグインがGradleオブジェクトモデルの可変プロパティにアクセスするときはいつでも、構成フェーズが終了するまでそのアクセスを延期する必要があります。(それまでは、プロパティの値は変更される可能性があります。)

GradleのAPIの一部(レイジーコレクション、コールバックを受け入れるメソッドなど)は、この問題に対処するための特別なサポートを提供します。それ以外の場合は、影響を受けるコードをでラップproject.gradle.projectsEvaluated { ... }するか、より高度な「従来のマッピング」手法を使用できます。

Gradleユーザーガイドhttp://forums.gradle.orgには、これらのトピックに関する詳細情報が記載されています。

于 2012-11-02T15:53:52.700 に答える
1

ここで私の答えを確認してください

このブロックは、projectEvaluatedクロージャーまたはafterTaskクロージャーの後に配置できます。純粋なスタンドアロンだけをテストしたわけではありませんが、機能する可能性があります。

AppExtension android = (AppExtension) project.extensions.findByName("android")
String versionName = android.defaultConfig.versionName
String versionCode = android.defaultConfig.versionCode
于 2015-03-30T20:15:43.337 に答える