Обучение мобильной разработке
Объединение зависимостей Android в пакеты с помощью каталогов версий Gradle
Новая функция Gradle 7.0, которая упрощает группировку зависимостей
Когда вы создаете приложение Jetpack Compose по умолчанию с помощью Android Studio, у вас, вероятно, будет приведенный ниже список зависимостей.
implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' implementation 'androidx.activity:activity-compose:1.3.1' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
Как хорошо, если все это собрано вместе, и мы можем просто сделать это
implementation (baseLibs.bundles.suite) testImplementation (baseLibs.junit) androidTestImplementation (baseLibs.bundles.android.test) debugImplementation (baseLibs.compose.ui.tooling)
Хорошая новость в том, что да, в Gradle 7.0 мы можем легко связывать зависимости вместе с помощью функции VersionCatalogs
, и вы можете делиться ею между проектами (как в одном репозитории, так и в отдельных репозиториях)
Чтобы оценить преимущества versionCatalogs
, я создал дизайн в
Все приведенные ниже объяснения основаны на приведенном выше дизайне.
Использование VersionCatalog Basic (преимущества объединения)
Хорошо, давайте начнем с основ. Чтобы использовать VersionCatalog
, нужно сначала определить enableFeaturePreview
в settings.gradle
, поскольку эта функция все еще находится в предварительном просмотре.
enableFeaturePreview('VERSION_CATALOGS')
Затем в разделе dependencyResolutionManagement
файла settings.gradle
создайте versionCatalogs
, как показано ниже.
versionCatalogs { version('compose_version', '1.0.0') alias('compose-ui-core').to('androidx.compose.ui', 'ui').versionRef('compose_version') // ... more alias bundle('suite', ['compose-ui-core', .... ] }
Из bundle
мы можем сгруппировать все зависимости вместе, поэтому в dependencies
из build.gradle
нам просто нужно следующее
implementation (baseLibs.bundles.suite)
Мы можем связать разные зависимости вместе, например для тестирования, для отладки, для testAndroid и т. д.
Благодаря этому теперь у нас может быть связка зависимостей в нашем build.gradle
, например
implementation (baseLibs.bundles.suite) testImplementation (baseLibs.junit) androidTestImplementation (baseLibs.bundles.android.test) debugImplementation (baseLibs.compose.ui.tooling)
Наличие каталогов версий в файле
Иногда нам не нравится определять все наши зависимости в settings.gradle
. Лучше иметь это в файле.
Мы можем сделать это, определив все зависимости в libs.versions.toml
файле и поместив их в корневую папку gradle
. Он будет загружен автоматически.
При желании мы можем назвать его другим именем или поместить в другое место, тогда мы можем легко использовать from(files(....))
в settings.gradle
.
versionCatalogs { baseLibs { // From Local Toml File from(files('gradle/baseLibs.versions.toml')) } }
Формат записи зависимостей в файл TOML отличается от формата записи в settings.gradle
файл. Например.
[versions] compose_version = '1.0.0' [libraries] compose-ui-core = { group = 'androidx.compose.ui', name = 'ui', version.ref = 'compose_version' } # ... more libraries [bundles] suite = ['compose-ui-core',.... ...]
Чтобы увидеть полный файл здесь.
Наличие VersionCatalogs в другом репозитории
Наличие файла TOML в репозитории проекта не слишком полезно. Иногда мы хотим поделиться ею как с другой библиотекой, которую можно экспортировать и использовать в любых проектах, как показано ниже.
Это действительно здорово, как и любой проект, и теперь он легко доступен для библиотеки каталога зависимостей, без необходимости переписывать их в собственном репозитории проекта.
Создание библиотеки каталога зависимостей
Для этого мы можем создать отдельную библиотеку. В проекте библиотеки достаточно иметь указанный ниже плагин в build.gradle
plugins { id 'version-catalog' }
Примечание: не используйте
plugin { id 'java-library' }
в библиотеке, так как это вызовет ошибку, когда другой проект попытается использовать библиотеку, с ошибкой в соответствии с этим stackOverflow.
В библиотеке все, что нам нужно, это build.gradle
. Мы определим в нем versionCatalogs
. Для этой цели у нас может быть доступ к catalog
.
plugins { id 'version-catalog' } catalog { // declare the aliases, bundles and versions in this block versionCatalog { alias('androidx-core').to('androidx.core:core-ktx:1.6.0') // More aliases bundle('androidx', ['androidx-core', ...]) } }
Вы можете просмотреть полный пример здесь.
После этого вам просто нужно выполнить обычный шаг публикации библиотеки. Вы можете сослаться на этот блог. Небольшое изменение заключается в том, что при публикации вам нужно будет опубликовать файл TOML вместо исходного кода и компонентов Java.
Следовательно, вместо публикации java
или release
компонентов
if (project.plugins.findPlugin("com.android.library")) { from components.release } else { from components.java } artifact androidSourcesJar
нам просто нужно что-то простое, как показано ниже
from components.versionCatalog
Вы можете просмотреть сценарий публикации здесь.
Использование библиотеки каталога зависимостей
После публикации библиотеки каталога зависимостей, чтобы использовать ее, нам просто нужно получить к ней доступ из settings.gradle
, как показано ниже.
versionCatalogs { baseLibs { from("io.github.elye:dependencies-lib:1.0.0") } }
Вот и все. Теперь любой проект может получить доступ к общим каталогам версий.
Дополнительные мысли… использование versionCatalogs для библиотеки
Очень приятно, что все приложения теперь могут обращаться к versionCatalogs
в settings.gradle
для общих зависимостей.
Один вопрос: если мы создаем библиотеку (а не приложение), может ли библиотека зависеть от versionCatalogs
в ее settings.gradle
файле?
Это может вызвать вопрос, потому что settings.gradle
корневого файла является внешним файлом (на корневом уровне) для экспорта первой библиотеки (зеленый цвет ниже).
Хорошая новость в том, что versionCatalogs
хотя и является внешним по отношению к папке библиотеки, при компиляции все зависимости встроены в библиотеку и упаковываются как библиотека. Следовательно, versionCatalogs
также можно использовать в библиотечном проекте.
Это было экспериментировано с использованием этой библиотеки.
Последние мысли
versionCatalogs
выглядит удобно. Но есть несколько соображений, прежде чем его использовать.
- это все еще функция предварительного просмотра, ничто не может гарантировать, что она не изменится.
- в Android Studio, похоже, не появляется новое обновление зависимостей, когда оно есть (в отличие от случая, когда зависимость напрямую реализуется в
build.gradle
, когда доступна более новая версия, Android Studio может отметить необходимость обновления)
Помимо двух вышеперечисленных пунктов, в целом у меня довольно удобная функция для объединения общих зависимостей для использования в нескольких проектах.
Спасибо Наньчен Янг за то, что поделился со мной информацией о доступности этой функции и поигрался с ней.