2017-06-26 95 views
1

在Android工作室(大概ANY)gradle這個文件,下面的代碼工作:爲什麼不能用大括號來處理?

task build { 
} 

和一個次要變化導致徹底崩潰:

task build 
{ 
} 

這已經出現在其他線程前,但在修復構建文件的上下文中。我的問題是爲什麼不能用gradle/groovy來處理任何一種支撐風格?許多其他語言應付得很好,所以這裏有什麼大不了的?

回答

1

在任何情況下閱讀本想知道,在解決辦法是很簡單的。

task build \ 
{ 
} 

我只是想知道,以「爲什麼」 ......

+0

gradle這個構建腳本是DSL,並不是嚴格意義上的Groovy腳本或類文件。但是,我覺得這是一個錯誤,可能值得將它作爲[問題跟蹤器上的問題](https://github.com/gradle/gradle/issues)發佈? –

3

它實際上是所有正確的,在錯誤消息:

build file '.../build.gradle': 80: Ambiguous expression could be a parameterless closure expression, an isolated open code block, or it may continue a previous statement; 
    solution: Add an explicit parameter list, e.g. {it -> ...}, or force it to be treated as an open block by giving it a label, e.g. L:{...}, and also either remove the previous newline, or add an explicit semicolon ';' @ line 80, column 1. 

因爲一個Groovy語法糖做的方法以lambda作爲最後一個參數,查看線語言構造,下面的代碼塊:

task build {} 
task build2(type: Copy) {} 

等於他們更經常的形式:

task build({}) 
task build(type: Copy, {}) 

現在,你真的不希望那些花括號那裏劃定一個普通的代碼塊,而是一個Groovy拉姆達,這應該作爲參數傳遞給build方法傳遞。

然而,從它的外觀來看,Groovy無法真正確定它是否真的是一個lambda被作爲參數傳遞給上一行中的方法,或者當您將換行符置於其間時,它們是不相關的代碼塊。然後你去了,錯誤信息中描述的模棱兩可,就在那裏。

按照錯誤消息的建議,你也可以使用下面的語法,而不是一個你在哪裏逃避換行字符:

task build 
{ -> 
} 

最後,用於調用動態的task關鍵字方法(在您的示例中名爲build)不是特定於Groovy的,而是Gradle DSL功能。

+0

但'doLast \ N {...'作品...想想解析任務定義 –

+0

有趣......的錯誤時,它更多的是DSL的問題和爲什麼會發生看了純Groovy的我,看到線2122法(無論碰巧短班,HA)和相關GroovyDoc的:https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/antlr/groovy.g。 難道是因爲doLast是靜態定義的(未'static',當然)方法,該方法總是需要一個單一的閉合參數(https://docs.gradle.org/3.5/dsl/org.gradle.api.Task .html),並且在gradle中的'task'關鍵字之後調用的方法都是動態的,因此無法告訴它們應該具有哪些參數? –

+0

這絕對是一個'構建'任務的DSL問題/實現選擇,因爲我使用的其他'關鍵字'都沒有這個問題(buildscript,插件,發佈,artifactory等)。 – Bungles

相關問題