web-dev-qa-db-ja.com

Gradleタスクにパラメーターまたは引数を渡す方法

私はエリックウェンデリンのcssプラグインを含めようとしているgradleビルドスクリプトを持っています http://eriwen.github.io/gradle-css-plugin/

実装するのに十分簡単であり、(結合してgzip圧縮するのではなく)縮小のみが必要なため、ビルドスクリプトの適切な部分は次のようになります。

minifyCss {
    source = "src/main/webapp/css/brandA/styles.css"
    dest = "${buildDir}/brandA/styles.css"
    yuicompressor {
        lineBreakPos = -1
    }
}

war {
    baseName = 'ex-ren'
}

war.doFirst {
    tasks.myTask.minifyCss.execute()
}

これは完璧です。gradlewarタスクを実行すると、minifyCssタスクが呼び出され、ソースのcssファイルが取得され、buildDirに縮小版が作成されます

ただし、縮小が必要なcssファイルがいくつかありますが、1つのファイルに結合しません(したがって、combinesCssタスクは使用していません)。

私ができることは、minifyCssタスク参照変数のsourceとdestプロパティを作成することです(それが正しい用語ですか?)-ある種の変数-シグネチャでタスクに渡される変数、またはグローバル変数、または何か ...

私が推測するこのようなもの(これは機能しません):

minifyCss(sourceFile, destFile) {
    source = sourceFile
    dest = destFile
    yuicompressor {
        lineBreakPos = -1
    }
}

war {
    baseName = 'ex-ren'
}

war.doFirst {
    tasks.myTask.minifyCss.execute("src/main/webapp/css/brandA/styles.css", "${buildDir}/brandA/styles.css")
    tasks.myTask.minifyCss.execute("src/main/webapp/css/brandB/styles.css", "${buildDir}/brandB/styles.css")
    tasks.myTask.minifyCss.execute("src/main/webapp/css/brandC/styles.css", "${buildDir}/brandC/styles.css")
}

これも機能しません:

def sourceFile = null
def destFile = null

minifyCss {
    source = sourceFile
    dest = destFile
    yuicompressor {
        lineBreakPos = -1
    }
}

war {
    baseName = 'ex-ren'
}

war.doFirst {
    sourceFile = "src/main/webapp/css/brandA/styles.css"
    destFile = "${buildDir}/brandA/styles.css"
    tasks.myTask.minifyCss.execute()
}

私の人生では、タスクを呼び出して変数を渡す方法を理解することができません:(

どんな助けも大歓迎です。

45
Nathan Russell

私はあなたがおそらくCSSの各セットの縮小を別々のタスクとして見たいと思うと思います

task minifyBrandACss(type: com.eriwen.gradle.css.tasks.MinifyCssTask) {
     source = "src/main/webapp/css/brandA/styles.css"
     dest = "${buildDir}/brandA/styles.css"
}

etc etc

ちなみに、戦争タスクのアクションでミニファイタスクを実行するのは奇妙に思えます。戦争タスクに依存させる方が理にかなっているのではないでしょうか。

2
Perryn Fowler

Gradleを呼び出すときに-P引数を渡すことを検討する必要があります。

Gradle Documentation から:

--project-propルートプロジェクトのプロジェクトプロパティを設定します(例:-Pmyprop = myvalue)。セクション14.2「Gradleのプロパティとシステムのプロパティ」を参照してください。

このbuild.gradleを考慮する

task printProp << {
    println customProp
}

Gradle -PcustomProp=myPropを呼び出すと、次の出力が得られます。

$ gradle -PcustomProp=myProp printProp
:printProp
myProp

BUILD SUCCESSFUL

Total time: 3.722 secs

これは、パラメーターを渡すために私が見つけた方法です。

66
Bipi

パラメータを渡すタスクのタイプがJavaExecで、Gradle 5を使用している場合、たとえばアプリケーションプラグインのrunタスクの場合、 --args=...コマンドラインオプション を使用してパラメーターを指定します。たとえば、gradle run --args="foo --bar=true"です。

それ以外の場合、これを行う便利な組み込み方法はありませんが、3つの回避策があります。

1.値が少ない場合、タスク作成関数

可能な値が少なく、事前にわかっている場合は、それらのそれぞれに対してタスクをプログラムで作成できます。

void createTask(String platform) {
   String taskName = "myTask_" + platform;
   task (taskName) {
      ... do what you want
   }
}

String[] platforms = ["macosx", "linux32", "linux64"];
for(String platform : platforms) {
    createTask(platform);
}

次に、タスクを次のように呼び出します。

./gradlew myTask_macosx

2.標準入力ハック

便利なハックは、標準入力を介して引数を渡し、そこからタスクを読み取ることです。

./gradlew myTask <<<"arg1 arg2 arg\ in\ several\ parts"

以下のコードで:

String[] splitIntoTokens(String commandLine) {
    String regex = "(([\"']).*?\\2|(?:[^\\\\ ]+\\\\\\s+)+[^\\\\ ]+|\\S+)";
    Matcher matcher = Pattern.compile(regex).matcher(commandLine);
    ArrayList<String> result = new ArrayList<>();
    while (matcher.find()) {
        result.add(matcher.group());
    }
    return result.toArray();   
}

task taskName, {
        doFirst {
            String typed = new Scanner(System.in).nextLine();
            String[] parsed = splitIntoTokens(typed);
            println ("Arguments received: " + parsed.join(" "))
            ... do what you want
        } 
 }

ビルドスクリプトの先頭に次の行を追加する必要もあります。

import Java.util.regex.Matcher;
import Java.util.regex.Pattern;
import Java.util.Scanner;

3. -Pパラメータ

最後のオプションは、-PパラメータをGradleに渡すことです。

./gradlew myTask -PmyArg=hello

その後、ビルドスクリプトでmyArgとしてアクセスできます。

task myTask {
    doFirst {
       println myArg
       ... do what you want
    }
}

@ 789のクレジットを 引数をトークンに分割する際の回答

43
task mathOnProperties << {
    println Integer.parseInt(a)+Integer.parseInt(b)
    println new Integer(a) * new Integer(b)
}

$ gradle -Pa=3 -Pb=4 mathOnProperties
:mathOnProperties
7
12

BUILD SUCCESSFUL
6
user3877963

Gradleフォーラム に提示されている方法をお勧めします。

def createMinifyCssTask(def brand, def sourceFile, def destFile) {
    return tasks.create("minify${brand}Css", com.eriwen.gradle.css.tasks.MinifyCssTask) {
        source = sourceFile
        dest = destFile
    }
}

私はこの方法を使用してカスタムタスクを作成しましたが、非常にうまく機能します。

5
AutonomousApps