Как я могу поделиться зависимостями между модулями Android
У меня есть модуль приложения Android (приложение) и модуль библиотеки Android (библиотека). И приложение, и библиотека содержат такие же зависимости:
dependencies {
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'io.reactivex:rxjava:1.0.13'
compile 'io.reactivex:rxandroid:0.25.0'
}
Однако, когда я пытаюсь добавить этот блок в проект build.gradle, он жалуется, что не знает DSL "compile".
РЕДАКТИРОВАТЬ: я спрашиваю о том, чтобы поместить этот блок зависимостей в PROJECT build.gradle, чтобы избежать повторения в build.gradle каждого модуля.
6 ответов
Вы можете определить общие зависимости gradle в модуле библиотеки, и если модуль приложения имеет библиотеку в качестве зависимости, вам не нужно указывать все дважды. Пойдя дальше, вы можете создать "общий" модуль, который требует общих зависимостей gradle, и чтобы модуль app и library требовал общего модуля.
Начиная с версии 3.0.0 Gradle Plugin, есть более хороший способ сделать это. Мы можем контролировать, доступна ли каждая зависимость только для текущего модуля или для текущего модуля и любых модулей, которые зависят от него. Это позволит нам легко обмениваться зависимостями между модулями в проекте.
Вот как мы использовали для объявления зависимостей:
- скомпилируйте 'example.dependency:1.0.0'
Вот новые конфигурации, которые должны заменить компиляцию:
- реализация 'example.dependency:1.0.0' -> эта зависимость используется только внутри этого модуля
- api 'example.dependency:1.0.0' -> эта зависимость также будет доступна в любых сборках, которые зависят от этого модуля
Вот как это сделать с архитектурой, которую вы упомянули в вопросе. Предполагая, что у нас есть модуль с именем 'library', который используется модулем 'app', мы можем использовать конфигурацию API, чтобы объявить, что зависимость должна использоваться совместно с любым модулем, который зависит от нее.
модуль библиотеки build.gradle
dependencies {
// dependencies marked 'implementation' will only be available to the current module
implementation 'com.squareup.okhttp:okhttp:2.4.0'
// any dependencies marked 'api' will also be available to app module
api 'com.squareup.retrofit:retrofit:1.9.0'
api 'io.reactivex:rxjava:1.0.13'
api 'io.reactivex:rxandroid:0.25.0'
}
модуль приложения build.gradle:
dependencies {
// declare dependency on library module
implementation project(':library')
// only need to declare dependencies unique to app
implementation 'example.dependency:1.0.0'
}
Пожалуйста, смотрите это руководство для получения дополнительной информации и диаграмм.
Блок зависимостей (закрытие) нуждается в DependencyHandler в качестве делегата
Вам необходимо передать DependencyHandler каждого проекта в общие зависимости в проекте gradle.build.
проект build.gradle
ext.sharedGroup = {dependencyHandler->
delegate = dependencyHandler
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'io.reactivex:rxjava:1.0.13'
compile 'io.reactivex:rxandroid:0.25.0'
}
приложение build.gradle
dependencies {
sharedGroup dependencies
}
ссылка https://github.com/b1uec0in/DependencyVersionResolver
(см. раздел 2. Использование группы зависимостей по умолчанию. В этом примере объясняются многие другие советы по совместному использованию версии библиотеки, версий SDK... для большого проекта, в котором много модулей.)
Вы можете сделать что-то вроде этого, когда проект build.gradle определит зависимости, необходимые в качестве имен переменных, а затем в файлах приложения build.gradle вам просто нужно будет включить имена переменных. Это очень полезно, когда у вас много модулей и вы не хотите редактировать всех при изменении номера версии!
проект build.gradle
buildscript {
ext {
googlePlayServicesVersion = '7.5.0'
supportLibVersion = '22.2.0'
}
... (the rest of your repositories/dependency info here) ...
}
ext {
minSdkVersion=16
targetSdkVersion=21
buildToolsVersion='22.0.1'
compileSdkVersion=21
//Android Dependencies
supportV4 = 'com.android.support:support-v4:' + supportLibVersion
supportAnnotations = 'com.android.support:support-annotations:' + supportLibVersion
recyclerView = 'com.android.support:recyclerview-v7:' + supportLibVersion
cardView = 'com.android.support:cardview-v7:' + supportLibVersion
palette = 'com.android.support:palette-v7:' + supportLibVersion
appCompat = 'com.android.support:appcompat-v7:' + supportLibVersion
multidex = 'com.android.support:multidex:1.0.1'
appCompat = 'com.android.support:appcompat-v7:' + supportLibVersion
supportDesign = 'com.android.support:design:' + supportLibVersion
playServicesAnalytics = 'com.google.android.gms:play-services-analytics:' + googlePlayServicesVersion
}
файлприложения build.gradle
dependencies {
compile rootProject.ext.supportV4
compile rootProject.ext.appCompat
compile rootProject.ext.supportAnnotations
compile rootProject.ext.recyclerView
compile rootProject.ext.cardView
compile rootProject.ext.palette
compile rootProject.ext.appCompat
compile rootProject.ext.multidex
compile rootProject.ext.supportDesign
compile rootProject.ext.playServicesAnalytics
}
Надеюсь, что это поможет!
Делитесь библиотеками с помощью блока ext в корневом модуле проекта
Это простой способ использовать библиотеку во всех модулях проекта Android.
Пожалуйста, выполните следующие действия:
- Добавить блок ext (используется для определения дополнительных свойств проекта) в корневом файле проекта gradle.
- Добавьте общие библиотеки с именем переменной в блоке ext, например, имя = [библиотеки без ключевого слова реализации]
- Используется этот дополнительный блок на уровне модуля, используя реализацию и имя переменной, например, реализация variable_name
См. ниже код для полной реализации
build.gradle: проект
buildscript {
... (the rest of your repositories here) ...
}
ext { **// ext block start here**
appModuleLibraries = [
commonLibraries,
/*Projects*/
project(':hco-cutout'),
project(':utils')
]
commonLibraries = [
/*Android Libs*/
'androidx.core:core-ktx:1.7.0',
'androidx.appcompat:appcompat:1.4.1',
'com.google.android.material:material:1.5.0',
'androidx.constraintlayout:constraintlayout:2.1.3',
/*Gesture viw for image zooming */
'com.alexvasilkov:gesture-views:2.5.2',
]
cutoutModulleLibraries = [
commonLibraries,
project(':utils'),
// Selfie segmentation
'com.google.mlkit:segmentation-selfie:16.0.0-beta4',
/*checker board drawable*/
'com.github.duanhong169:checkerboarddrawable:1.0.2',
]
} **// ext block end here**
build.gradle: приложение
dependencies {
/*App Module Libraries in root project gradle*/
implementation appModuleLibraries
}
build.gradle: вырез
dependencies {
/*cutout Module Libraries in root project gradle*/
implementation cutoutModulleLibraries
implementation project(':utils')
}
Надеюсь, что это поможет!
Основываясь на ответе @SMKS, я бы предпочел это решение для возможности переходного варианта и простоты
проект build.gradle
buildscript {
... (the rest of your repositories/dependency info here) ...
}
ext {
googlePlayServicesVersion = '7.5.0'
supportLibVersion = '22.2.0'
}
файл приложения build.gradle
dependencies {
compile 'com.android.support:support-v4:' + supportLibVersion
compile ' com.android.support:support-annotations:' + supportLibVersion
compile = 'com.android.support:recyclerview-v7:' + supportLibVersion {
transitive = true // do not know if this make sens/interest just for example
}
...
}