Привет, друзья! Я написал эту статью для тех из вас, кто работает с 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 упоминает две возможные стратегии
- Перенос существующего синтаксиса вашей сборки на Kotlin, шаг за шагом, с сохранением структуры — то, что мы называем механической миграцией
- Реструктуризация вашей логики сборки в соответствии с лучшими практиками 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”