Как я могу поделиться зависимостями между модулями 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.

Пожалуйста, выполните следующие действия:

  1. Добавить блок ext (используется для определения дополнительных свойств проекта) в корневом файле проекта gradle.
  2. Добавьте общие библиотеки с именем переменной в блоке ext, например, имя = [библиотеки без ключевого слова реализации]
  3. Используется этот дополнительный блок на уровне модуля, используя реализацию и имя переменной, например, реализация 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
    }
   ...
}
Другие вопросы по тегам