我遇到需要从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")
}
println "Variables new value: " + warVersion.projVersion
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的破坏方式? 如果有可能我正在寻找,请让我知道解决方案,如何实现。
答案 0 :(得分:2)
您没有正确考虑build lifecycle。
当您定义warVersion
任务(取决于explodedWar
)时,您告诉Gradle您希望在执行{{1}期间设置属性projVersion
任务。
这意味着您无法在warVersion
任务运行之后尝试阅读该属性。否则,它将不会被定义。如果您尝试使用任务&#34;之外的值,则您不再等待warVersion
任务运行。超出任务范围的代码将在配置阶段执行,而不是执行阶段。
当我尝试在任务区域之外使用变量new值时(抱歉,但这是一个需要),它会抛出错误:
您需要重构定义warVersion
变量的方式。
PropertyState
API用于延迟评估的属性。最后一个并不理想,因为它绕过了任务便利,例如最新的检查。但是,您可以通过更改复制任务来调用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")
。