如何在gradle脚本中使用任务外部的变量

时间:2017-07-18 13:26:17

标签: gradle

我遇到需要从war文件中读取文件(对于某些值,比如版本号)并在同一脚本中的其他地方使用它的情况(我为此目的使用war文件进行爆炸复制任务)。为了解释这个需要,我将用下面的例子写下来:

定义变量:

def projVersion = "NULL"

爆炸战争:

task explodedWar(type: Copy) {
    from zipTree("$buildPath/projectName.war")
    into file("$buildPath/projectName")
}

从爆炸文件夹中读取文件并获取值:

task warVersion(dependsOn : ['explodedWar']) <<{
        Properties versionFile = new Properties()
        versionFile.load(new FileInputStream("$buildPath/projectName/META-INF/MANIFEST.MF"))
        ext.projVersion = versionFile.getProperty("Version")
}

在任务之外使用变量new值时(此部分抛出错误):

println "Variables new value: " + warVersion.projVersion 

在其他任务中使用变量new值时(此部分成功):

task VersionPrint(dependsOn : ['warVersion']) <<{
    println "Project Version under print task" + warVersion.projVersion
}

基本上,我可以在同一个脚本中的任何其他 任务 中使用变量的新值,但是当我尝试使用变量new value时在任务区域之外(抱歉,但这是一个需要),它正在抛出错误:

错误(在任务外部使用变量时)***

* What went wrong:
A problem occurred evaluating root project 'Scripts'.
> Could not find property 'projVersion' on task ':warVersion'

让我知道,我是否想要实现可实现的目标?或者它是否会成为gradle的破坏方式? 如果有可能我正在寻找,请让我知道解决方案,如何实现。

1 个答案:

答案 0 :(得分:2)

您没有正确考虑build lifecycle

当您定义warVersion任务(取决于explodedWar)时,您告诉Gradle您希望在执行{{1}期间设置属性projVersion任务。

这意味着您无法在warVersion任务运行之后尝试阅读该属性。否则,它将不会被定义。如果您尝试使用任务&#34;之外的值,则您不再等待warVersion任务运行。超出任务范围的代码将在配置阶段执行,而不是执行阶段。

  

当我尝试在任务区域之外使用变量new值时(抱歉,但这是一个需要),它会抛出错误:

您需要重构定义warVersion变量的方式。

  1. 您可以重构代码,这样您就不需要使用任务之外的值。
  2. 您可以将新的PropertyState API用于延迟评估的属性。
  3. 您可以在配置阶段更改逻辑以执行。
  4. 最后一个并不理想,因为它绕过了任务便利,例如最新的检查。但是,您可以通过更改复制任务来调用Project#copy来尝试,然后读取属性文件并声明属性值,所有这些都超出了任务范围:

    projVersion

    此代码将在配置阶段执行。现在,在此之后的任何地方,您都应该能够引用copy { from zipTree("$buildPath/projectName.war") into file("$buildPath/projectName") } Properties versionFile = new Properties() versionFile.load(new FileInputStream("$buildPath/projectName/META-INF/MANIFEST.MF")) ext.projVersion = versionFile.getProperty("Version")