我陷入了需要从战争文件中读取文件(对于某些值,比如说版本号)并在同一脚本中的其他地方使用它的情况(我为此目的使用复制任务分解战争文件)。为了说明需要,我将用下面的例子写下来:
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
}
基本上,我可以在同一个脚本中的任何其他任务中使用变量的新值,但是当我尝试在任务区域之外使用变量的新值时(抱歉,这是必要的),它抛出错误:
* What went wrong:
A problem occurred evaluating root project 'Scripts'.
> Could not find property 'projVersion' on task ':warVersion'
让我知道,我是否正在努力实现可以实现的目标?或者它会成为 gradle 的打破规则的方式吗?如果可能我正在寻找什么,请让我知道解决方案,如何实现。
您没有正确考虑构建生命周期。
当您定义warVersion
依赖于的任务时explodedWar
,您是在告诉 Gradle 您希望projVersion
在warVersion
任务执行期间设置该属性。
这意味着,你不能尝试读取属性,直到之后的warVersion
运行任务。否则,它不会被定义。如果您尝试“在任务之外使用该值”,您将不再等待warVersion
任务运行。任务范围之外的代码将在配置阶段执行,而不是执行阶段。
当我尝试在任务区域之外使用变量新值时(抱歉,这是必要的),它抛出错误:
您需要重构定义projVersion
变量的方式。
PropertyState
API 用于延迟评估的属性。最后一个并不理想,因为它绕过了任务便利,例如最新检查。但是,您可以通过将复制任务更改为 call 来尝试一下Project#copy
,然后读取属性文件并声明您的属性值,所有这些都在任务范围之外:
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")
此代码将在配置阶段执行。现在,在此之后的任何地方您都应该能够引用ext.projVersion
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句