Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gradle - Что где валяется и когда всё соберётся

Gradle - Что где валяется и когда всё соберётся

Что такого есть в Gradle, что вам стоит перейти на него? Какие возможности этой системы сборки наиболее интересны в больших проектах, и как эффективно её применять? Обо всем этом и многом другом пойдет речь в рамках данного доклада. Мы рассмотрим использование стандартных плагинов и задач, заглянем под капот системы зависимостей и поймем, что вытворяет Gradle с вашим компьютером во время сборки. В практической части поговорим о параллельных и инкрементальных сборках, а также напишем плагин и пару задач, которые будут работать максимально эффективно. Ну и напоследок, вы научитесь отлаживать Gradle скрипты и плагины, чтобы быстро решать проблемы со сборкой.

Yuriy Artamonov

October 22, 2016
Tweet

More Decks by Yuriy Artamonov

Other Decks in Programming

Transcript

  1. Система сборки Gradle Сборка описывается файлом build.gradle (+ settings.gradle) Файл

    сборки – код на Groovy (+ DSL) Проект и его сборку можно описать декларативно Для сборки можно подключать плагины (сборка WAR, запуск Jetty, etc)
  2. Задачи в Gradle Единица исполнения – задача Каждая задача –

    это Groovy объект Задачи связаны между собой особым порядком исполнения и зависимостями Задачи включают в себя несколько действий
  3. Gradle – это Maven, только лучше Gradle может использовать зависимости

    из Maven репозиториев Gradle может генерировать pom.xml для собранных артефактов Gradle расширяет модель зависимостей Maven, добавляя концепцию конфигураций См. https://gradle.org/maven_vs_gradle/, - Gradle лучше чем Maven. - Чем? - Чем Maven.
  4. Непрраааввильно ты, Дядя Фёдор, билд собираешь! 1. Всегда используйте daemon

    (включен в 3.1 по умолчанию) > gradle --daemon 2. Используйте аббревиатуры задач: > gradle asse buildWS dep 3. Компилируйте только нужные проекты: > gradle :app-web:deploy start 4. Очищайте только нужные проекты: > gradle :app-core:clean 5. Используйте --offline если в вашем проекте есть –SNAPSHOT зависимости
  5. Параллельные сборки Режим --parallel позволяет сэкономить время в проектах с

    большим количеством независимых модулей или несколькими очень большими независимыми модулями. > gradle coJava --parallel Как не накосячить: 1) У всех задач должны быть зависимости 2) У некоторых задач, должен быть определён порядок: start.mustRunAfter deploy
  6. Инкрементальные сборки Задача может проделывать работу над только что изменившимися

    файлами, не переделывая свою работу над теми файлами, которые не менялись. Incremental Задача должна : определять входные файлы, входные параметры и выходные файлы принимать объект IncrementalTaskInputs реализовать логику реакции на изменённые и удалённые файлы https://github.com/jreznot/gd-incremental
  7. И не таких дебажили! Отлаживать скрипты нельзя  Можно отлаживать

    задачи, плагин buildSrc, отдельные проекты плагинов Для отладки нужны опции GRADLE_OPTS и gradle должен быть запущен с --no-daemon Если вам придётся разбираться с проблемой в задаче, объявленной в скрипте, то воспользуйтесь опциями --debug --no-daemon
  8. Groovy то у нас есть, У нас ума не хватает!

    Соблюдайте баланс между декларативным и императивным подходами: 1) Выносите переиспользуемый код в плагин проекта в buildSrc 2) Если одинаковый код используется в нескольких проектах, то публикуйте плагин и используйте его в проектах 3) Если задача становится типовой для проектов – делайте декларативные настройки
  9. Откуда берутся зависимости Плагины берутся из репозиториев, объявленных в buildScript

    { repositories { Артефакты Maven для компиляции скачиваются из репозиториев, объявленных в repositories { Артефакты Maven попадают в компиляцию модуля если они объявлены в dependencies { модуля А ещё… Репозитории мог добавить плагин Зависимости мог добавить плагин Зависимости могла добавить задача во время этапа конфигурации Репозиторий mavenLocal(~/.m2) обычно имеет приоритет над удалёнными репозиториями
  10. Какие зависимости? Используйте --refresh-dependencies на серверах CI Загляните в ~/.m2,

    возможно кто-то или что-то установило туда другую версию артефакта Знайте, какие репозитории добавляют плагины! Используйте задачу dependencies нужного модуля для расшифровки разрешения зависимостей Если ничего не помогло, то открывайте ~/.gradle/caches/modules-2/