2015-11-24 21 views
10

同じbuild.gradleファイル内のあるタスクから別のタスクに変数を渡したいとします。私の最初のgradleタスクは最後のコミットメッセージを引き出し、このメッセージを別のタスクに渡す必要があります。コードは以下の通りです。事前に助けてくれてありがとう。Gradle:1つのタスクから別のタスクに変数を渡す

task gitMsg(type:Exec){ 
    commandLine 'git', 'log', '-1', '--oneline' 
    standardOutput = new ByteArrayOutputStream() 
    doLast { 
     String output = standardOutput.toString() 
    } 
} 

変数 'output'を下のタスクに渡したいとします。

task notifyTaskUpcoming << { 
    def to = System.getProperty("to") 
    def subj = System.getProperty('subj') 
    def body = "Hello... " 
    sendmail(to, subj, body) 
} 

私はgitメッセージを 'body'に組み込みたいと思っています。

答えて

9

output変数は、doLastメソッドの外部ではあるが、スクリプトのルートに定義して、単に別のタスクで使用することができます。例:

//the variable is defined within script root 
def String variable 

task task1 << { 
    //but initialized only in the task's method 
    variable = "some value" 
} 

task task2 << { 
    //you can assign a variable to the local one 
    def body = variable 
    println(body) 

    //or simply use the variable itself 
    println(variable) 
} 
task2.dependsOn task1 

ここには2つのタスクが定義されています。 Task2Task1に依存します。つまり、2番目のファイルは最初のファイルの後にのみ実行されます。文字列タイプのvariableは、ビルドスクリプトのルートで宣言され、task1doLastメソッド(注:<<doLastに等しい)で初期化されます。変数は初期化され、他のタスクでも使用できます。

+0

感謝をそんなに!私はまったくそれを試していたはずです...多くの感謝! =) – crystallinity

+0

この素晴らしい例をありがとう。あなたに誇り、兄弟! –

26

私はグローバルプロパティは避けるべきだと思うとGradleのタスクにプロパティを追加することによって、そうすることをあなたに素敵な方法を提供しています:

task task1 { 
    doLast { 
      task1.ext.variable = "some value" 
    } 
} 

task task2 { 
    dependsOn task1 
    doLast { 
     println(task1.variable) 
    } 
} 
+2

他の方法を知って嬉しいです - ありがとう!なぜグローバルなプロパティを避けるべきですか? – crystallinity

+3

なぜグローバルプロパティが使用されたのかのコンテキストが余りにも簡単すぎるからです。変数を生成するタスクに変数を直接バインドすることで、共通のオブジェクト指向設計に近いと思います。 (ちょうど私の2セントここに) –

+0

私は参照してください。クール - お時間をいただきありがとうございます=) – crystallinity

関連する問題