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

jon*_*ros 8 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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

打印出来:

%> gradle -q myTask
  In plugin: unspecified
  In build file: 1.0.0
Run Code Online (Sandbox Code Playgroud)

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

tim*_*tes 10

您在致电后设置了该属性 apply

如果你搬家

version = "1.0.0"
Run Code Online (Sandbox Code Playgroud)

到了之前

apply plugin: MyPlugin
Run Code Online (Sandbox Code Playgroud)

它应该工作

编辑

按照Peter的回答,您可以看到这也有效:

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"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

延迟评估,$project.version直到构建评估完成

  • 最好立即添加任务(否则构建脚本将无法访问它),并且只推迟需要访问`project.version`的部分配置.`println`是一个不幸的例子,因为它通常在一个任务动作(`doLast {...}`)中完成,它只在*执行时*进行评估,因此不会受到配置顺序问题的影响. (2认同)

Pet*_*ser 5

与评估顺序处理是挑战编写插件的时候,它需要一定的知识和专业知识的掌握.

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

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

摇篮用户指南http://forums.gradle.org提供有关这些主题的更多信息.