Gradle 为什么构建脚本的不同部分会看到project.version属性的不同值?

Gradle 为什么构建脚本的不同部分会看到project.version属性的不同值?,gradle,Gradle,我在所有项目部分的gradle中执行以下操作 if (project.hasProperty('myVersion')) { project.ext.realVersion = project.myVersion project.version = project.myVersion println("project version set") } else { project.ext.realVersion = 'Developer-Buil

我在所有项目部分的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的地方,version不起作用,但在另一个位置它工作得很好:()…真奇怪

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')

任务版本文件()问题与
version
属性无关。生成脚本是按顺序计算的。如果不能保证在读取属性之前设置了
version
属性,则必须将属性的读取推迟到配置阶段结束。否则,将不可避免地运行into问题。一种方法是将读取属性的配置代码放入
gradle.projectsEvaluated{}
块。
task.doFirst{}
是另一种方法,但有一个限制,即配置值不会被考虑用于最新检查


有时会有一个更简单的解决方案。例如,对于像
Zip
这样的归档任务,您可以只设置
baseName
扩展名
,而不是
archiveName
。一如既往,我鼓励您学习。

将以下内容放在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")
      }
    }
}

这仍然不能解释为什么我在上面的myZip和versionFile任务中都使用project.ext.realVersion时,它能工作,但当我使用project.version时,它不能工作……第一个始终通过,第二个始终失败。有强有力的证据表明这是一个评估顺序问题。绝对肯定的是,您必须提供一个comp删除和可复制的示例。