2016-12-31 81 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個答案,所以我自己回答(並且對這兩個答案都進行了投票)。

相關問題