为什么这个字符串替换/连接在Gradle中不起作用?

时间:2016-12-31 20:19:16

标签: gradle

build.gradle文件的此片段中,对${appengineVersion}(第11行)的第一次引用会导致错误。但第二个参考(第27行)工作正常。那是为什么?

为了让它正常工作,我必须在第11行显式包含版本号...这意味着我将在下次忘记更新它。如何解决?

apply plugin: 'war'
apply plugin: 'appengine'

def appengineVersion = "1.9.48"

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "com.google.appengine:gradle-appengine-plugin:${appengineVersion}"
    }
}

war {
    from 'src/main/webUI/app'

    exclude('src/main/webUI/app/node_modules')
}

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    appengineSdk "com.google.appengine:appengine-java-sdk:${appengineVersion}"

    compile "javax.servlet:servlet-api:2.5"
...

3 个答案:

答案 0 :(得分:2)

在项目构建文件的顶层声明变量并不会使它们对所有Gradle块可见。 buildscript {}很特殊,它会在脚本的任何其他部分之前得到评估。您可以将声明移到buildscript,但它也应该使其对其他块可见:

buildscript {
    def appengineVersion = "1.9.48"
    ...

但你需要使用像

dependencies {
    appengineSdk "com.google.appengine:appengine-java-sdk:" + appengineVersion

答案 1 :(得分:2)

标准gradle练习是在ext命名空间中声明用户定义的属性。见here

你应该这样做:

ext.appengineVersion = "1.9.48"

答案 2 :(得分:2)

解决方案结合了Oleg和RaGe的答案:

将appengineVersion的声明移动到buildscript块中并在ext命名空间中定义它。

buildscript {
    ext.appengineVersion = "1.9.48"
    repositories {
        mavenCentral()
}
dependencies {
    classpath "com.google.appengine:gradle-appengine-plugin:${appengineVersion}"
    }
}

这允许变量由buildscript依赖项和项目依赖项解决:

dependencies {
    appengineSdk "com.google.appengine:appengine-java-sdk:${appengineVersion}"

    compile "javax.servlet:servlet-api:2.5"
    compile "com.google.appengine:appengine-api-1.0-sdk:${appengineVersion}"

这两个答案都是解决方案的关键部分。但不幸的是,我不能接受2个答案,所以我自己回答(并对两个答案进行投票)。