如何在Custom Gradle插件中获取$ project.version?

时间:2012-11-02 15:31:32

标签: groovy gradle

在自定义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

除了我真的想知道为什么?

3 个答案:

答案 0 :(得分:10)

您在致电apply

后设置了该属性

如果你移动

version = "1.0.0"

到行前

apply plugin: MyPlugin

应该有效

修改

Following Peter's answer,您可以看到这也有效:

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,直到评估构建完成

答案 1 :(得分:5)

在编写插件时,处理评估顺序是 挑战,需要掌握一些知识和专业知识。

请注意,在构建脚本中,插件会在设置版本之前应用(并因此执行!)。这是常态,插件必须处理它。粗略地说,只要插件访问Gradle对象模型的可变属性,就必须将该访问推迟到配置阶段结束。 (在那之前,财产的价值仍然可以改变。)

Gradle的一些API(延迟集合,接受回调的方法等)为处理此问题提供了特殊支持。除此之外,您可以将受影响的代码包装在project.gradle.projectsEvaluated { ... }中,或使用更复杂的“约定映射”技术。

Gradle User Guidehttp://forums.gradle.org提供了有关这些主题的更多信息。

答案 2 :(得分:0)

检查我的回答here

您可以在projectEvaluated闭包或afterTask闭包之后放置此块。我没有测试纯粹的独立,但它可能有用。

AppExtension android = (AppExtension) project.extensions.findByName("android")
String versionName = android.defaultConfig.versionName
String versionCode = android.defaultConfig.versionCode