在Android工作室(大概ANY)gradle這個文件,下面的代碼工作:爲什麼不能用大括號來處理?
task build {
}
和一個次要變化導致徹底崩潰:
task build
{
}
這已經出現在其他線程前,但在修復構建文件的上下文中。我的問題是爲什麼不能用gradle/groovy來處理任何一種支撐風格?許多其他語言應付得很好,所以這裏有什麼大不了的?
在Android工作室(大概ANY)gradle這個文件,下面的代碼工作:爲什麼不能用大括號來處理?
task build {
}
和一個次要變化導致徹底崩潰:
task build
{
}
這已經出現在其他線程前,但在修復構建文件的上下文中。我的問題是爲什麼不能用gradle/groovy來處理任何一種支撐風格?許多其他語言應付得很好,所以這裏有什麼大不了的?
在任何情況下閱讀本想知道,在解決辦法是很簡單的。
task build \
{
}
我只是想知道,以「爲什麼」 ......
它實際上是所有正確的,在錯誤消息:
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功能。
但'doLast \ N {...'作品...想想解析任務定義 –
有趣......的錯誤時,它更多的是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'關鍵字之後調用的方法都是動態的,因此無法告訴它們應該具有哪些參數? –
這絕對是一個'構建'任務的DSL問題/實現選擇,因爲我使用的其他'關鍵字'都沒有這個問題(buildscript,插件,發佈,artifactory等)。 – Bungles
gradle這個構建腳本是DSL,並不是嚴格意義上的Groovy腳本或類文件。但是,我覺得這是一個錯誤,可能值得將它作爲[問題跟蹤器上的問題](https://github.com/gradle/gradle/issues)發佈? –