我在allprojects部分的gradle中执行以下操作...
if (project.hasProperty('myVersion')) {
project.ext.realVersion = project.myVersion
project.version = project.myVersion
println("project version set")
} else {
project.ext.realVersion = 'Developer-Build'
project.version = 'Developer-Build'
println("project version set to devbuild")
}
现在,我有一些正确使用project.version的代码并且它可以工作,但是还有其他代码也使用相同的属性project.versoin,结果是'未指定'。如果我将两者都更改为project.realVersion,它们都可以工作。版本似乎是这个讨厌的特殊属性,似乎并不总是有用。
使用属性的代码如下....(注意我在哪里使用realVersion,版本不起作用,但它在其他位置工作正常:()....多么奇怪。
task versionFile() << {
File f = new File('output/version');
f.mkdirs()
File v = new File(f, 'version'+project.ext.realVersion)
println('v='+v.getAbsolutePath())
v.createNewFile()
}
task myZip(type: Zip) {
archiveName 'dashboard-'+project.version+'.zip'
from('..') {
include 'webserver/run*.sh'
include 'webserver/app/**'
include 'webserver/conf/**'
include 'webserver/play-1.2.4/**'
include 'webserver/public/**'
include 'webserver/lib/**'
}
from('output/version') {
include '**'
}
}
myZip.dependsOn('versionFile')
assemble.dependsOn('myZip')
答案 0 :(得分:1)
问题与version
属性无关。构建脚本按顺序进行评估。如果您无法保证在之前设置version
属性,那么您必须推迟阅读该属性,直到配置阶段结束。否则你将不可避免地遇到问题。一种方法是将读取属性的配置代码放入gradle.projectsEvaluated {}
块。 task.doFirst {}
是另一种方式,但有一个限制,即配置的值不会被考虑用于最新检查。
有时候会有一个更简单的解决方案。例如,对于Zip
等归档任务,您只需设置baseName
和extension
而不是archiveName
。一如既往,我鼓励您学习DSL reference。
答案 1 :(得分:0)
将以下内容放在doFirst中,如下所示:
allprojects {
doFirst {
if (project.hasProperty('myVersion')) {
project.ext.realVersion = project.myVersion
project.version = project.myVersion
println("project version set")
} else {
project.ext.realVersion = 'Developer-Build'
project.version = 'Developer-Build'
println("project version set to devbuild")
}
}
}