95

build.gradleいくつかのタスクを作成した Gradle ビルド スクリプト ( ) があります。これらのタスクは、ほとんどがメソッド呼び出しで構成されています。呼び出されたメソッドもビルド スクリプト内にあります。

さて、状況は次のとおりです。

さまざまなタスクを含むかなりの量のビルド スクリプトを作成していますが、元のスクリプトと同じ方法を使用しています。したがって、これらの「一般的なメソッド」を何らかの方法で抽出して、作成する新しいスクリプトごとにコピーするのではなく、簡単に再利用できるようにしたいと考えています。

Gradle が PHP である場合、次のようなものが理想的です。

//script content
...
require("common-methods.gradle");
...
//more script content

しかしもちろん、それは不可能です。またはそれは?

とにかく、どうすればこの結果を達成できますか?これを行うための最良の方法は何ですか? 私はすでにGradleのドキュメントを読みましたが、どの方法が最も簡単でこれに最適かを判断できないようです.

前もって感謝します!


アップデート:

メソッドを別のファイルに抽出することができました

( を使用apply from: 'common-methods.gradle')、

したがって、構造は次のようになります。

parent/
      /build.gradle              // The original build script
      /common-methods.gradle     // The extracted methods
      /gradle.properties         // Properties used by the build script

からタスクを実行した後build.gradle、新しい問題にぶつかりました。どうやら、メソッドが にあるときに認識されないのですcommon-methods.gradle

それを修正する方法についてのアイデアはありますか?

4

5 に答える 5

177

ピーターの答えに基づいて、これが私のメソッドをエクスポートする方法です:

の内容helpers/common-methods.gradle:

// Define methods as usual
def commonMethod1(param) {
    return true
}
def commonMethod2(param) {
    return true
}

// Export methods by turning them into closures
ext {
    commonMethod1 = this.&commonMethod1
    otherNameForMethod2 = this.&commonMethod2
}

そして、これは私が別のスクリプトでこれらのメソッドを使用する方法です:

// Use double-quotes, otherwise $ won't work
apply from: "$rootDir/helpers/common-methods.gradle"

// You can also use URLs
//apply from: "https://bitbucket.org/mb/build_scripts/raw/master/common-methods.gradle"

task myBuildTask {
    def myVar = commonMethod1("parameter1")
    otherNameForMethod2(myVar)
}

Groovy でメソッドをクロージャーに変換する方法については、こちらを参照してください。

于 2014-04-25T10:43:16.693 に答える
1

Matthias Braun's answerを少し調整することをお勧めします。同じメソッド名を 2 回書く代わりに、明確で簡潔にするために、単純に次のようにしないでください。

ext.commonMethod1 = (param) -> {
    return true
} as Closure<boolean>

as-operatorの使用法は、この関数がboolean-type の値を返すことを明示的に伝えるだけです。

結局のところ、これは依然として Groovy の良さです。きちんとね?

于 2022-01-04T17:28:28.447 に答える