#android #gradle #build.gradle
Вопрос:
Что у меня есть
У меня есть два разных модуля в моем проекте Android:
- приложение: Это основной модуль приложения Android, где расположен почти весь код приложения.
- ядро: Это еще один модуль, в котором я хотел бы указать весь базовый код, который будет использоваться в модуле приложения, например, базовый фрагмент, базовую модель или интерфейсы, которые я хотел бы реализовать в модуле приложения.
В основном build.gradle
файле у меня есть все эти зависимости:
//Moshi
implementation "com.squareup.moshi:moshi-kotlin:$moshi_version"
//Retrofit
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-moshi:$moshi_converter_version"
//okhttp
implementation "com.squareup.okhttp3:okhttp:$okhttp3_version"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_loggin_interceptor"
//Koin
implementation "io.insert-koin:koin-android:$koin_version"
implementation "io.insert-koin:koin-androidx-viewmodel:$koin_viewmodel_version"
Все эти зависимости я бы не хотел объявлять также в файле приложения build.gradle
.
Я читаю некоторые блоги и официальную документацию Gradle, но мне не удается этого добиться.
Чего я хочу
Я хочу «наследовать» все зависимости только от файла gradle основного модуля
Структура проекта должна быть примерно такой:
core
|_build.gradle (common dependencies)
|_app
|_build.gradle (just specific dependencies)
Что я пробовал
Я читал, что это возможно при реализации основного проекта следующим образом (в файле сборки приложения.gradle):
dependencies {
implementation project (":core")
......
}
Но у меня есть несколько классов в модуле приложения, использующем основные классы, которые не удалось найти. Например:
import com.example.core.presentation.base.BaseViewModel
Ошибка говорит о том, что не удалось разрешить ссылку, как будто ее не существует.
Какие-нибудь идеи?
Заранее спасибо!!
Комментарии:
1.
implementation project (":core")
должно быть в вашем приложении модули build.gradle, а не основные модули (как вы говорите в своем вопросе)2. О! извините, я просто хотел сказать «модуль приложения»! @Бланделл
Ответ №1:
Я взглянул на ваш GitHub 🙂
Я думаю, что это тот пример, который вы пытаетесь привести
https://github.com/smoralb/BaseApplication/tree/feature/core?
То, что вы описываете в своем вопросе, должно сработать, поэтому я взглянул.
Проблема в ваших основных модулях build.gradle
строка 1
(https://github.com/smoralb/BaseApplication/blob/feature/core/core/build.gradle#L1)
У тебя есть это:
apply plugin: 'com.android.application'
Когда у вас должно быть это:
apply plugin: 'com.android.library'
затем с помощью
implementation project (":core")
внутри вашего модуля приложения вы получите доступ к классам изнутри core
app
.
Комментарии:
1. О! Я этого не понимал. Я пробовал, но, похоже, у него проблема с зависимостями, он говорит, что у него отсутствуют или смешиваются зависимости. Изменения, которые я внес, заключались в следующем: 1. Переместите все зависимости в основной
build.gradle
файл. 2. Внесите измененияapply plugin: 'com.android.library'
в основнойbuild.gradle
файл 3. Добавьте реализацию основного модуля в файл приложенияbuild.gradle
и удалите остальные зависимости.dependencies { implementation project (':core') }
2. Это основной файл github.com/smoralb/BaseApplication/blob/feature/core/core/… И это файл приложения github.com/smoralb/BaseApplication/blob/feature/core/app/…
3. Если вы хотите, чтобы зависимости, объявленные в core, были доступны в приложении, вам необходимо изменить их префикс с
implementation
наapi
(в файле core).
Ответ №2:
Самый простой способ добиться этого-использовать плагин для соглашений. Не позволяйте части плагина слишком сильно пугать вас, это немного настройка, но не такая сложная.
Там вы получаете 3 варианта:
- поместите плагины в каталог buildSrc и попросите gradle автоматически подобрать их
- поместите плагин в определенный модуль и включите сборку (составную сборку).
- поместите плагин в определенный модуль, отпустите его и загрузите как плагин двоичной зависимости.
более подробную информацию можно найти здесь: https://docs.gradle.org/current/samples/sample_convention_plugins.html
в качестве альтернативы, если вы просто хотите поддерживать версии в 1 месте, но не возражаете против размещения зависимостей в обоих файлах сборки, plaform может быть еще проще: https://docs.gradle.org/current/userguide/java_platform_plugin.html
Комментарии:
1. Спасибо! Я собираюсь взглянуть на это.