2016-12-31 68 views
4

在这个build.gradle文件的片段中,对${appengineVersion}(第11行)的第一个引用会导致错误。但第二个参考(第27行)工作正常。这是为什么?为什么这个字符串替换/连接在Gradle中不起作用?

为了让它工作,我必须在第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" 
... 
+0

具体的错误是:“找不到属性'appengineVersion'org.gradle.api.internal.artifacts.dsl.dependencie[email protected]” – CMerrill

回答

2

在项目构建文件的顶层声明变量不会使它们对所有Gradle块可见。 buildscript {}是特殊的,它在脚本的任何其他部分之前被评估。您可以将申报进入buildscript不过,应该使其可见于其他块太:

buildscript { 
    def appengineVersion = "1.9.48" 
    ... 

但你需要使用像

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

谢谢!这是解决方案的一半:) – CMerrill

2

标准gradle这个做法是在声明用户定义的属性在ext命名空间中。见here

你应该这样做:

ext.appengineVersion = "1.9.48" 
+0

谢谢!这是解决方案的一半:) – CMerrill

2

溶液由奥列格和愤怒的答案的组合:

移动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个答案,所以我自己回答(并且对这两个答案都进行了投票)。

相关问题