вторник, 23 июня 2015 г.

Про Gradle: #1 Таски

Цією публікацією, я б хотів розпочати серію статей пов'язаних з Gradle, ох, хотілося б мені знати це, коли я почав писати скрипти на Gradle.
Сьогодні ми поговоримо про таски в Gradle, а особливо про їх конфігурацію та виконання частин таску. Зважаючи на те, що багато термінів можуть виявитися невідомими більшості читачів, буде набагато легше приводити приклади. По суті ми постараємось виявити в чому різниця між цими трьома прикладами:

task myTask {
    println "Hello, World!"
}

task myTask {
    doLast {
        println "Hello, World!"
    }
}

task myTask << {
    println "Hello, World!"
}

Моя основна ціль написати таск, який виводить на екран текст "Hello, World!" при виконанні.
Коли я починав розбиратися з Gradle, першими з моїх варіантів, була реалізація подібним чином:

task myTask {
    println "Hello, World!"
}

Зараз, спробуємо запустити таск!

user$ gradle myTask
Hello, World!
:myTask UP-TO-DATE

Здається все працює! Ми бачимо "Hello, World!".
АЛЕ! Воно працює не так, як ми очікували. І ось чому. Давайте-спробуємо викликати gradle tasks і побачимо, які інші такски в нас є:

user$ gradle tasks
Hello, World!
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
..........

Секундочку! Чому наше "Hello, World!" вивелось на екран? Ми ж просто викликали tasks, Чому ж запустився наш таск!
Причина чому це трапляється в тому, що таски Gradle матюь 2 стадії життєвого циклу:
  • Стадія конфігурації
  • Стадія виконання
Насправді, я не був дуже точний в термінології, але ця аналогія допомогла мені зрозуміти, що ж таке таски.
Справа в тому, що Gradle має сконфігурувати всі таски зазначені в скрипті перед тим як білд буде запущено. Немає значення, якщо деякі таски будуть запущені - вони все-одно мають бути сконфігуровані.
Знаючи це, як нам знати, яка частина таску виконується під час конфігурації, а яка під час виконання?
Відповіддю є - частина вказана у верхній частині таску - це і є секція конфігурації таску:

task myTask {
    def name = "Pavel" //<-- this is evaluated during configuration
    println "Hello, World!"////<-- this is also evaluated during configuration
}

Ось чому, коли ми викликали gradle tasks то було видно текст "Hello, World!" - це була виконана наша частина конфігурції. Але це не те, що нам було потрібно - нам потрібно що текст "Hello, World!" був надрукований, коли ми явно викликаємо таск.
То як нам сказати Gradle зробити щось коли наш таск буде виконуватись?
Щоб зробити це нам необхідно зазначити дію. Найлегший спосіб зробити це через Task#doLast() метод:

task myTask {
    def text = 'Hello, World!' //configure my task
    doLast {
        println text //this is executed when my task is called
    }
}

Тепер наш "Hello, World!" текст буде виведено тільки тоді, коли буде явно введена команда gradle myTask
Круто, тепер ми знаємо як зконфігурувати і змусити наш таск виконувати ту роботу, яку ми йому задамо тільки тоді, коли ми його викликаємо. Залишився тільки третій варіант, що використовує символ "<<"?:

task myTask2 << {
    println "Hello, World!" 
}

Насправді, це просто коротка версія від doLast. Буде виконано теж саме, коли ми напишемо:

task myTask {
    doLast {
        println 'Hello, World!' //this is executed when my task is called
    }
}

Отже, тепер все знаходиться в блоці виконання, я не можу зконфігурувати мій таск таким же чином отже ми це зробимо завдяки конструкції doLast (це досі можливо, але трохи по-іншому). Стає зрозуміло, що цей спосіб буде незамінними при невеликих таксках без блоку конфігурації, але якщо ви маєте щось більше ніж "Hello, World!" - можливо вам буде в нагоді doLast.

Happy gradling!

Source.

Комментариев нет:

Отправить комментарий