среда, 1 марта 2017 г.

Что важно в работе с gradle

Оценить какие таски есть в текущем проекте. Если мы находимся в папке с build.gradle файлом, то можем узнать какие таски у билда существуют:
$ gradle tasks


 Нужно понимать, что Gradle -- это The Gradle build language, то есть DSL написанный на Groovy, но он уже считается уже языком для сборки со своей структурой и как бы "ключевыми словами".

Правильно создавать обертку для проекта, что позволит сразу после скачки проекта из VCS, сбилдить проект без узнавания правильной версии и установки gradle.
Делаем это так, в папке проекта:
$ gradle wrapper --gradle-version 2.0


C 3.0 версии по умолчанию запускает Gradle Daemon, который позволяет значительно ускорить билды последующие от первого, это просто необходимо на машине разработчика, но не нужно на билд сервере или CI сервере.
Чтобы узнать текущее состояние демона:
gradle --status
Чтобы выключить демон, можно сделать это прямой командой:
gradle --stop
Или же выключить через настройку(что подойдет для CI/build server):
~/.gradle/gradle.properties или в GRADLE_OPTS="-D
org.gradle.daemon=false


На Gradle можно билдить любые проекты, но есть 3 основных типа:
build.gradle
apply plugin: "[lang]"
или
plugins {
    id: "[lang]"
}
Где [lang] определяет тип проекта:
  • JVM project: [lang] = java | groovy | scala
  • Native project: [lang] = c | cpp | assembler | objective-c | objective-cpp | windows-resources
  • Android project: [lang] = android
Также не редкость когда мы пишем кросс-платформенный продукт, то у нас сабпроекты на разных языках и платформах, Gradle это тоже билдит.


Фазы билда:
- Инициализация. Gradle поддерживает одно- и многопроектные билды. Во время этой фазы определяется какие проекты принимают участие в билде и создает для каждого экземпляр класса Project.
- Настройка. Во время этой фазы все экземпляры класса Project настраиваются, в этом время скприпты сборки всех проектов выполняются. С версии 1.4 есть включаемая фича "настраивать только по необходимости" - в больших многопроектных билдах это может быть критично собирать все дерево тасок, если мы вызываем только конкретную. При включенном этом флаге конфигурироваться будут только те, которые в зависимостях от вызываемого таска. В будущем эта фича скорее всего попадет из инкубатора в паблик.
- Выполнение. Определяет множество тасок, которые были созданы и сконфигурированы на предыдущих фазах, для выполнения. Определяется это с аргументов командной строки, ну и добавляются те, от которых первые зависят.


settings.gradle
Это файл настроек, который может существовать рядом с файлом билда(build.gradle).  Он должен быть в коренной папке многопроектного билда, где определяются какие подпроекты принимают участие в билд процессе. Однопроектный билд может не содержать этот файл в принципе, единственный случай для такого билда - это добавить библиотеки в класспаз для билд скриптов. Выполняется этот файл на фазе инициализации.
Если файла в текщей директории нет:
- то Gradle ищет папку с именем master и смотрит туда;
- если нет такой папки/внутри файла, то Gradle ищет вверх по родительским директориям(так кстати определяется, что проект является подпроектом).

Можно подписываться на события жизненного цикла билда.

Отличие Gradle от Maven. Первый основан на графе зависимостей тасок, которые выполняют работу. Второй на модели фиксированных линейных фаз,  к которым можно присоединять цели(гоалс) .

Gradle под капотом идет с возможностью конвертировать мавен проект. Для этого в корневой директории Maven проекта нужно выполнить:
$ gradle init
Эта команда не только создает структуру проекта с нуля, ну и если сталкивается с мавен проектом, пытается создать build.gradle и settings.gradle файлы и определить их контент. Потом мы не идеальности доделаем руками и конвертация прошла практически безболезненно:)


Можно устанавливать проперти, которые будут использоваться в билде. Это можно сделать в:
- build file
- gradle.properties в корневой директории проекта
- ~/.gradle/gradle.properties
- при запуске через командную строку -Dsome.property
Билд файл имеет наивысший приоритет и перегрузит все остальное, это может показаться проблемой - ведь можно ожидать build file содержит значения по умолчанию - именно для этого используются профили.
Gradle рекомендует использовать кемелкейс вместо разделения точками(как в maven).


Профили
Можно сделать например так -- три файла: profile-default.gradle, profile-test.gradle, and profile-prod.gradle.
build.gradle:
if (!hasProperty('buildProfile')) ext.buildProfile = 'default'
apply from: "profile-${buildProfile}.gradle"
Ну и сам запуск:
$ gradle -PbuildProfile=test build

Таск с одинаковым именем можно создать только один раз в проекте, но потом мы можем добавить множество блоков кода для дополнительных настроек:
task hello {
  doLast { task ->
    println "I'm $task.project.name"
  }
}

hello {
  doLast {
    println "..."
  }
}

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

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