2015-11-24 5 views
10

Я хочу передать переменную из одной задачи в другую, в том же файле build.gradle. Моя первая задача градита вытягивает последнее сообщение фиксации, и мне нужно, чтобы это сообщение передавалось другой задаче. Код ниже. Благодарим за помощь заранее.Gradle: Передача переменной из одной задачи в другую

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-сообщение в «тело».

ответ

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 

Здесь заданы две задачи. Task2 зависит от Task1, это означает, что второй будет работать только после первого. variable типа String объявляется в корне сценария сборки и инициализируется в методе 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

, потому что это просто слишком легко ослабить контекст, почему используется глобальная собственность. имея переменную, непосредственно связанную с задачей, которая ее производит, она ближе к общему дизайну OO, который мне кажется, и легче отслеживать. (только мои 2 цента здесь) –

+0

Я вижу. Cool - еще раз спасибо за ваше время и ввод =) – crystallinity

Смежные вопросы