#gradle #dependencies
#gradle #зависимости
Вопрос:
На уровне приложения build.gradle
я часто включаю следующие зависимости
dependencies {
implementation "androidx.appcompat:appcompat:$appCompatVersion"
implementation "androidx.cardview:cardview:$cardVersion"
implementation "com.google.android.material:material:$materialVersion"
implementation "androidx.recyclerview:recyclerview:$recyclerViewVersion"
implementation "androidx.annotation:annotation:$androidXAnnotations"
...
}
Из-за этого файл становится все длиннее и поэтому я подумываю о переносе всех таких зависимостей на уровень проекта build.gradle
, например (просто пример):
ext {
includeUnitTestDeps() {
implementation "androidx.appcompat:appcompat:$appCompatVersion"
implementation "androidx.cardview:cardview:$cardVersion"
implementation "com.google.android.material:material:$materialVersion"
implementation "androidx.recyclerview:recyclerview:$recyclerViewVersion"
implementation "androidx.annotation:annotation:$androidXAnnotations"
}
}
(Причина, по которой на уровне проекта, но не на уровне приложения, потому что у нас может быть несколько модулей в проекте, таким образом, уровень проекта — лучшие места)
Затем на уровне приложения build.gradle
мы вызываем
dependencies {
ext.includeUnitTestDeps()
...
}
Примечание: Я не очень знаком с синтаксисом Groovy / Gradle, поэтому не уверен, что это работает (на самом деле я пытался, но это не позволяет определить такой метод в ext
). Но если вы знаете какое-либо решение, пожалуйста, помогите мне. Большое спасибо.
Ответ №1:
Есть несколько способов, о которых я могу подумать
1 — Добавьте зависимости ко всем подпроектам (в родительском)
subprojects {
dependencies {
implementation 'com.google.guava:guava:23.0'
testImplementation 'junit:junit:4.12'
}
....
}
2 . Добавьте зависимости к конкретным подпроектам (в родительском)
// this will add dependencies to project a, b, and c
// when You add a new subproject, You have to add it to here also
// If You these need dependencies available in it
configure([project(':a'), project(':b'), project(':c')]) {
dependencies {
implementation 'com.google.guava:guava:23.0'
.....
}
}
3 — Использование метода для добавления зависимостей
//in parent
// define a method to add dependencies
// sub projects who need these dependencies will call this method
def addDependencies(subProject) {
subProject.dependencies.add("implementation", "com.google.guava:guava:23.0")
subProject.dependencies.add("implementation", "org.apache.commons:commons-lang3:3.8.1")
// add others
}
// in child
dependencies {
addDependencies(this)
// You can add other dependencies here If this child has any
}
4 . Определите зависимости в виде списка в родительском
// parent
ext.appDependencies = [
[configuration: "implementation", dependency: "org.apache.commons:commons-lang3:3.8.1"],
[configuration: "implementation", dependency: "com.google.guava:guava:23.0"]
]
// child
dependencies {
rootProject.appDependencies.each {
add(it.configuration, it.dependency)
}
}
По следующей ссылке есть подробное объяснение этого метода, который использует внешний файл для определения этих зависимостей.
https://hackernoon.com/android-how-to-add-gradle-dependencies-using-foreach-c4cbcc070458
Вы также можете комбинировать 3. и 4. такие методы, как определение списка с зависимостями, вызов функции, которая выполняет итерацию и добавляет зависимости в этот список. Я бы использовал первый или второй метод, если смогу. (Также могут быть другие способы достижения этого.)
Комментарии:
1. Спасибо @Silver Shroud. Ваше решение действительно полезно. Это то, что я искал долгое время до сих пор.