如何在自定义插件摇篮获得$ project.version?(How to Get $project

2019-08-02 05:57发布

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

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

Answer 1:

您可以设置该属性之后您调用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直至构建完成评估



Answer 2:

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

请注意,在构建脚本,插件被应用(因此执行!)为之前的版本。 这是常态,和插件有对付它。 粗略地说,每当插件访问摇篮对象模型的一个可变的属性,它有推迟的访问,直到配置阶段结束。 (在此之前,该属性的值仍然可以更改。)

有些摇篮API的(懒惰的集合,方法接受回调等)提供了解决这一问题的特别支持。 除此之外,您可以在包装受影响的代码project.gradle.projectsEvaluated { ... }或者使用更复杂的“公约映射”技术。

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



Answer 3:

检查我的答案在这里

您可以在projectEvaluated关闭或afterTask结束后把这个块。 我没有测试只是纯粹的独立,但它可能工作。

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


文章来源: How to Get $project.version in Custom Gradle Plugin?
标签: groovy gradle