2017-06-26 6 views
1

(そしておそらくANY)のGradleファイルは、次のコードは動作します。これは前に他のスレッドに来ているなぜ中括弧を扱うことができないのですか? Androidのメーカーで

task build 
{ 
} 

task build { 
} 

そして、もう一つのマイナーな変更が完了メルトダウンを引き起こしただし、ビルドファイルの修正のコンテキストで。私の疑問は、どちらのブレーススタイルにも対応できるように、グラブル/グルーヴを作ることができない理由です。他の多くの言語はそれにうまく対応していますので、ここで大きな違いは何ですか?

答えて

1

これを読んでいる人が不思議に思う場合は、回避策が十分に簡単です。

task build \ 
{ 
} 

私はちょうどまでと思っていた「なぜ」...

+0

gradleのビルドスクリプトは、厳密にはGroovyスクリプトやクラスファイルではなく、DSLです。これはバグだと思うが、[Issue Trackerの問題](https://github.com/gradle/gradle/issues)として投稿する価値があるだろうか? –

3

このエラーメッセージで、実際にすべての権利があります。そのための方法を作るためにGroovyの構文糖の

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. 

ラムダを最後のパラメータのルックライン言語構造体として使用すると、次のコードブロックが得られます。

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

は彼らより通常のフォームに等しい:

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

は今、あなたは本当にそこに、それらの中括弧は、通常のコードブロックを区切る必要はありませんが、buildメソッドにパラメータとして渡されるべきGroovyのラムダ、 。

しかし、Groovyは、実際にラムダが前の行のメソッドにパラメータとして渡されているのか、無関係なコードブロックが間に改行を入れたのかを実際に判断することはできません。そしてそこにはエラーメッセージに記載されているあいまいさがあります。

最後に
task build 
{ -> 
} 

、ダイナミックを呼び出すために使用taskキーワード:

エラーメッセージのアドバイスに従い、あなたはまた、代わりにあなたは改行文字をエスケープされている1つの次の構文を使用することができますメソッド(あなたの例ではbuildという名前です)は、Groovy固有のものではなく、Gradle DSL機能です。

+0

しかし、 'doLast \ n {...' works ...タスク定義を解析するときにDSLの問題だと思っています –

+0

面白い...エラーとそれがなぜ起こったのか、純粋なGroovyが私に見えます。短いクラスに行った、ハ!)と関連groovydoc:https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/antlr/groovy.g。 doLastは、常に単一のクロージャパラメータが必要な静的に定義された(もちろん静的ではない)メソッドである可能性があります(https://docs.gradle.org/3.5/dsl/org.gradle.api.Task .html)と、gradleの 'task'キーワードの後に​​呼び出されるメソッドはすべて動的なので、どのようなパラメータを持つべきかを知る方法はありません。 –

+0

私が使っている他のキーワードのどれもがこの問題(buildscript、プラグイン、リリース、アーティファクトなど)を持っていないので、確かに 'ビルド'タスクDSLの問題/実装の選択です。 – Bungles

関連する問題