Настроить все зависимости в одном файле gradle?

#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 варианта:

  1. поместите плагины в каталог buildSrc и попросите gradle автоматически подобрать их
  2. поместите плагин в определенный модуль и включите сборку (составную сборку).
  3. поместите плагин в определенный модуль, отпустите его и загрузите как плагин двоичной зависимости.

более подробную информацию можно найти здесь: https://docs.gradle.org/current/samples/sample_convention_plugins.html

в качестве альтернативы, если вы просто хотите поддерживать версии в 1 месте, но не возражаете против размещения зависимостей в обоих файлах сборки, plaform может быть еще проще: https://docs.gradle.org/current/userguide/java_platform_plugin.html

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

1. Спасибо! Я собираюсь взглянуть на это.