2012-09-28 13 views
0

我做的的gradle中在allprojects節以下...爲什麼我的構建腳本的不同部分爲project.version屬性看到不同的值?

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通知,版本不工作,但它在其他位置的正常工作:()....怎麼怪異。

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

回答

1

該問題與version屬性無關,建立腳本是按順序評估的。如果您不能保證在之前設置version屬性您正在閱讀它,則必須推遲讀取該屬性,直到配置階段結束,否則你將不可避免地遇到問題。一種方法是將配置代碼讀取將該房產轉換成gradle.projectsEvaluated {}區塊。 task.doFirst {}是另一種方式,但具有配置值不會被考慮用於最新檢查的限制。

有時會有更簡單的解決方案。例如,在存檔任務如Zip的情況下,您可以設置baseNameextension而不是archiveName。一如往常,我鼓勵你學習DSL reference。在doFirst像下面的下面

+0

這仍然沒有解釋爲什麼當我在這兩個myZip和versionFile任務使用project.ext.realVersion以上,它的工作原理,但是當我使用project.version ,它行不通.....第一個一貫通過,第二個一直失敗。 –

+0

有強有力的證據表明這是一個評估訂單問題。要絕對確定,你必須提供一個*完整*和*可重現*的例子。 –

0

地點:

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") 
     } 
    } 
} 
相關問題