Рубрики
Без рубрики

Как Kotlin делает редактирование вашей сборки Gradle менее разочаровывающим

Улучшенное управление зависимостями с помощью плагина gradle-kotlin-dsl-libs. С тегами gradle, kotlin, android, java.

Привет, друзья! Я написал эту статью для тех из вас, кто работает с Gradle и одна из IDE JetBrains (или Android Studio), и я не совсем доволен этим.

Я хотел бы дать вам представление о том, как добавление небольшого количества Kotlin в вашу сборку Gradle делает ее менее неприятной.

Пока я этим занимаюсь, я представлю лучший способ управления зависимостями в моем новом проекте:

jmfayard/обновленные версии

Жизнь слишком коротка, чтобы искать в Google зависимости и версии

Жизнь слишком коротка, чтобы искать в Google зависимости и версии.

Документация находится по адресу jmfayard.github.io/refresh Варианты исполнения

  • Признание
  • Как выполнить миграцию
  • Управление зависимостями
  • Лень как великая добродетель программиста
  • Связи

Признание

Люди, которые меня знают, могут быть удивлены тем, что я собираюсь написать о Gradle и похвалить его. Я часто выражал отношения любви и ненависти, которые у меня были с Грэйдлом.

Много внимания было уделено теме производительности Gradle (на самом деле инструментов сборки Android). Там тоже была проделана большая работа. См. https://guides.gradle.org/performance/ и https://developer.android.com/studio/build/optimize-your-build .

Но я хочу сосредоточиться здесь на второй половине проблемы.

Обслуживание этих файлов build.gradle может быстро стать очень утомительным…

Яркой стороной Gradle является то, что он обеспечивает большую мощность и гибкость таблицы, благодаря файлам сборки, которые очень декларативны и удобны для чтения.

Но с большой мощью приходит потребность в большом инструменте… или очень неприятный пользовательский опыт.

И это была темная сторона Gradle. В то время как файлы build.gradle легко читать , их довольно сложно написать . Когда вам нужно настроить их, вы в основном действуете самостоятельно. Обычно какое-то время это не срабатывает, и вы не знаете почему. Затем в какой-то момент вы копируете и вставляете правильное решение, и оно работает, но вы тоже на самом деле не знаете, почему.

Что произошло, так это то, что динамическая природа Groovy плохо сочеталась со всем метапрограммированием, выполняемым в Gradle, чтобы обеспечить нам плохую поддержку инструментов.

Итак, это предыстория проекта Gradle kotlin-dsl , над которым Gradle и JetBrains спокойно работали. Он вот-вот достигнет зрелости, так что сейчас самое подходящее время обратить внимание на эту тему.

Как выполнить миграцию

Перенос логики сборки с Groovy на Kotlin упоминает две возможные стратегии

  1. Перенос существующего синтаксиса вашей сборки на Kotlin, шаг за шагом, с сохранением структуры — то, что мы называем механической миграцией
  2. Реструктуризация вашей логики сборки в соответствии с лучшими практиками Gradle и переход на Kotlin DSL в рамках этих усилий

Для наших существующих проектов последнее, как правило, имеет гораздо больше смысла.

Существует история о том, что многие программисты на Си начали заниматься C++, сделав этот первый шаг.

// before.c
int main() {
   /* I was doing C programming */
   printf("Hello, World!");
   return 0;
}

// after.cpp
int main() {
   // Now I'm now doing c++
   printf("Hello, World!");
   return 0;
}

В этом духе я сосредоточусь на практическом первом шаге, который вы можете предпринять сейчас с помощью Gradle & Kotlin.

Управление зависимостями

Gradle позволяет нам объявлять зависимости очень кратким способом

dependencies {
  implementation("com.squareup.okio:okio:2.0.0")
  implementation("io.reactivex.rxjava2:rxjava:2.2.0")
  implementation("de.mpicbg.scicomp:krangl:0.10.3")
}

У меня есть некоторые проблемы с этим кодом:

  • Редактирование магических строк подвержено ошибкам.
  • Как мне централизовать зависимости в многомодульном проекте?
  • Что такое Крангл?
  • Доступны ли более новые версии Okio и RxJava?

С помощью Groovy мы можем устранить проблемы централизации с помощью шаблона dependencies.gradle .

Сделать то же самое с Kotlin довольно просто:

// buildSrc/build.gradle.kts
plugins {
    `kotlin-dsl`
}

// buildSrc/src/main/kotlin/Libs.kt
object Libs {
    val okio = "com.squareup.okio:okio:2.0.0"
}

// some-module/build.gradle       or
// some-module/build.gradle.kts
dependencies {
   implementation(Libs.okio)
}

Код из папки buildSrc автоматически доступен для всех ваших файлов build.gradle или build.gradle.kts .

Лень как великая добродетель программиста

Я делал это для нескольких проектов, и поначалу я был счастлив. Примерно в моем третьем проекте стало очевидно, что извлечение всех этих строк утомительно.

Кроме того, мы еще не решили проблемы 3) Что такое Крангл? и 4) Какие новые версии доступны?

Существует очень хороший плагин от Бена Манеса, gradle-versions-plugin , который после применения к вашему проекту Gradle отвечает на этот вопрос. Итак, как ленивый программист, я задался вопросом: могу ли я расширить его, чтобы он генерировал именно тот код Kotlin, который мне нужен?

Как оказалось, это возможно, поэтому позвольте мне представить мой новый плагин Gradle!

В вашем верхнем файле build.gradle добавьте:

plugins {
  id("de.fayard.buildSrcVersions") version "$VERSION"
}

Вы найдете $VERSION по адресу https://plugins.gradle.org/plugin/de.fayard.buildSrcVersions .

Этот новый декларативный блок плагинов является предпочтительным способом объявления плагина вместо синтаксиса build script {...} , который обеспечивает худший пользовательский интерфейс Kotlin DSL.

Это команда, которую вы запускаете в первый раз, и каждый раз, когда вы добавляете новую зависимость или просто хотите проверить, какие версии доступны.

Сначала он выполняет задачу :обновления зависимостей , которая подключается к Интернету и может занять некоторое время. Эта задача создает отчет JSON с метаданными обо всех ваших зависимостях, который Kotlinpoet помогает преобразовать в следующий код.

// Folder buildSrc/src/main/kotlin

object Libs {

    /** [krangl website](https://github.com/holgerbrandl/krangl) */
    const val krangl: String = "de.mpicbg.scicomp:krangl:" + Versions.krangl

    /** [okio website](https://github.com/square/okio/) */
    const val okio: String = "com.squareup.okio:okio:" + Versions.okio

    /** [rxjava website](https://github.com/ReactiveX/RxJava) */
    const val rxjava: String = "io.reactivex.rxjava2:rxjava:" + Versions.rxjava
}
object Versions {

    const val krangl: String = "0.10.3" // up-to-date
    const val okio: String = "2.0.0" // available: milestone=2.1.0
    const val rxjava: String = "2.2.0" // available: milestone=2.2.2

}

Этот сгенерированный код – это все, что нам нужно, чтобы испытать гораздо лучшую интеграцию IDEA, предоставляемую Gradle kotlin-dsl в IntelliJ IDEA или Android Studio ≥ 3.2 .

Этот сгенерированный код – это все, что нам нужно, чтобы испытать гораздо лучшую интеграцию IDEA, предоставляемую Gradle || kotlin-dsl || в || IntelliJ IDEA || или || Android Studio ≥ 3.2 || .

Теперь мы решили проблемы, которые намеревались решить

  • Больше никаких волшебных строк, мы набираем Libs.<ВКЛАДКА> и автоматическое завершение делает все остальное.
  • Мы можем использовать их во всех build.gradle и build.gradle.kts файлы.
  • Чтобы узнать, что такое Krangle , мы нажимаем Краткое описание документации и нажмите на ссылку на веб-сайт.
  • Чтобы узнать, какие более новые версии доступны, мы просто переходим от ИДЕИ к Libs.okio , а оттуда к Versions.okio . В настоящее время используется 2.0.0, и полезный комментарий сообщает нам, что доступен 2.1.0. (Плагин никогда не применяет обновление зависимостей автоматически, это всегда должно быть задачей разработчика!!).

Groovy build.gradle и файлы Kotlin build.gradle.kts выглядят почти одинаково после написания. Что совершенно отличается, так это опыт написания этого, поэтому я буду рекомендовать вам запустить IntelliJ IDEA или Android Studio.

Я начал с признания, что ненавижу черную магию аспект Gradle. Открытие черного ящика с помощью Kotlin было очень полезным. Я понял, что Gradle – это просто хороший, полезный, хорошо документированный API. API, с которым вы можете работать, используя свои инструменты и навыки разработчика, как и с любым другим Java API. API, чья доброта была скрыта от нас. Я планирую углубиться в следующие статьи, если будет достаточно интереса.

Связи

Мой плагин

jmfayard/обновленные версии

Жизнь слишком коротка, чтобы искать в Google зависимости и версии

Жизнь слишком коротка, чтобы искать в Google зависимости и версии.

Документация находится по адресу jmfayard.github.io/refresh Варианты исполнения

Образцы gradle/kotlin-dsl

gradle/kotlin-dsl-образцы

Примеры сборок с использованием Gradle Kotlin DSL

Добро пожаловать! Gradle Kotlin DSL обеспечивает поддержку записи Gradle создает скрипты с использованием языка JetBrains/| Kotlin . Он направлен на то, чтобы предоставить пользователям Gradle богатый, гибкий и статически типизированный подход к разработке логики сборки в сочетании с наилучшими возможностями IDE и инструментария.

приступая к работе

Самый быстрый способ запустить и запустить сборку Gradle на основе Kotlin – это использовать gradle init

gradle init --dsl kotlin

или, если у вас еще не установлен Gradle, вы можете создавать сборки Gradle онлайн по адресу https://gradle-initializr.cleverapps.io/ .

Gradle Kotlin DSL задокументирован в специальной главе в руководстве пользователя Gradle.

Более того, Gradle руководство пользователя и руководства содержат выдержки из сценариев сборки, которые демонстрируют как Groovy DSL, так и Kotlin DSL. Это лучшее место, где можно найти, как сделать то или иное с помощью Gradle Kotlin DSL; и оно охватывает все функции Gradle от…

Оригинал: “https://dev.to/jmfayard/how-kotlin-makes-editing-your-gradle-build-less-frustrating-232l”