0

我在所有项目部分的 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,它们都可以工作。version 似乎是这个讨厌的特殊属性,似乎并不总是有效。

使用属性的代码如下....(注意我使用 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')
4

2 回答 2

1

这个问题与财产无关version。构建脚本是按顺序评估的。如果您不能保证在读取之前version设置了属性,则必须将读取属性推迟到配置阶段结束。否则你将不可避免地遇到问题。一种方法是将读取属性的配置代码放入块中。是另一种方式,但有一个限制,即配置的值不会被考虑进行最新检查。gradle.projectsEvaluated {}task.doFirst {}

有时有一个更简单的解决方案。例如,对于像 之类的存档任务Zip,您可以只设置baseNameandextension而不是archiveName. 与往常一样,我鼓励您学习DSL 参考

于 2012-09-28T18:52:08.423 回答
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")
      }
    }
}
于 2012-11-13T07:43:51.130 回答