Как извлечь зависимости Android Gradle (реализовать, testImplementation …) в метод в корне проекта?

#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. Ваше решение действительно полезно. Это то, что я искал долгое время до сих пор.