Как настроить зависимости в проекте с несколькими модулями Android Gradle с взаимозависимостями?

Вопрос

Как настроить зависимости модулей в проекте Android Gradle, где модули имеют зависимости друг от друга, чтобы я мог развернуть сборку нового моментального снимка или выпуск всех модулей за один раз?

Настройка проекта

У меня есть проект, состоящий из 2 модулей: lib-core и lib-help, с lib-help в зависимости от lib-core. Я хочу опубликовать lib-core и lib-help отдельно в Maven Central, так что pom файл lib-help указывает зависимость от lib-core с правильной версией.

Проект структурирован следующим образом:

/my-project-name
|
|--/lib-core
|  |-- build.gradle
|  |-- gradle.properties
|
|--/lib-help
|  |-- build.gradle
|  |-- gradle.properties
|
|-- build.gradle
|-- gradle.properties
|-- settings.gradle
|-- gradle-mvn-push.gradle

Файлы конфигурации проекта следующие, показывая только соответствующие части (по моему мнению):

settings.gradle

include ':lib-core', ':lib-help'

gradle.properties

GROUP=com.company
VERSION=5.0.0-SNAPSHOT

gradle -mvn-push.gradle:

apply plugin: 'maven'

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                // GROUP is defined in <root>/gradle.properties
                pom.groupId = GROUP
                // ARTIFACT is defined in <root>/<module>/gradle.properties
                pom.artifactId = ARTIFACT
                // VERSION is defined in <root>/gradle.properties
                pom.version = VERSION
            }
        }
    }
}

// Contains a lot more to fill in other meta-data like project name,
// developer name, github url, javadoc, signing of the artifacts, etc, etc..

Lib-ядро/ gradle.properties:

ARTIFACT=my-lib-core

Lib-ядро/build.gradle:

apply plugin: 'com.android.library'

// Contains more code to configure the android stuff, not relevant for this question

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

apply from: rootProject.file('gradle-mvn-push.gradle')

Lib-помощь/ gradle.properties

ARTIFACT=my-lib-help

Lib-помощь/build.gradle

apply plugin: 'com.android.library'

// Contains more code to configure the android stuff, not relevant for this question

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':lib-core')
}

apply from: rootProject.file('gradle-mvn-push.gradle')

Проблема

Когда я запускаю gradlew clean :lib-core:uploadArchives :lib-help:uploadArchives, все компилируется красиво, и загрузки загружаются в правильный репозиторий. В диспетчере репозитория Nexus я вижу артефакты для обоих модулей с правильным именем, версией, подписью и т.д., Но зависимость lib-help от lib-core в сгенерированном pom.xml неверна. Он использует имя проекта как groupId, имя модуля как artifactId и неопределенное имя версии:

<dependency>
    <groupId>my-project-name</groupId>
    <artifactId>lib-core</artifactId>
    <version>unspecified</version>
    <scope>compile</scope>
</dependency>

Следовательно, проекты, использующие lib-help как зависимость, не могут разрешить зависимость lib-core. Правильными значениями, которые должны были быть в lib-help pom.xml, являются groupId = com.company, artifactId = my-lib-core и version = 5.0.0-SNAPSHOT.

Чтобы исправить это, я подумал, что я использую зависимость maven в lib-help вместо зависимости от модуля, например:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.company:my-lib-core:' + VERSION
}

Естественно, эта версия не существует до того, как была выполнена команда uploadArchives для lib-core, но Gradle хочет разрешить зависимости всех модулей перед запуском любой из заданных команд. Таким образом, он не может разрешить эту зависимость и завершает работу с ошибкой при настройке проектов Gradle. Теперь я могу обойти это, временно установив зависимость lib-help на project(':lib-core'), затем отпустите lib-core, а затем настройте зависимость lib-help до 'com.company:my-lib-core:5.0.0-SNAPSHOT', а затем выпустите lib-help, но это просто doesn Кажется, правильный путь. Он приглашает человеческие ошибки (что, если я случайно увеличу номер версии между командами uploadArchives?), И требуется несколько ручных, строго упорядоченных шагов.

Вопрос (повторение)

Как настроить зависимости модулей в проекте Android Gradle, где модули имеют зависимости друг от друга, чтобы я мог развернуть сборку нового моментального снимка или выпуск всех модулей за один раз? (например, но не обязательно, с помощью команды gradlew clean :lib-core:uploadArchives :lib-help:uploadArchives)

Ответ 1

Возможно сохранение локальных зависимостей проекта (compile project(':core')), если вы переписываете POM перед загрузкой:

afterEvaluate { project ->
  uploadArchives {
    repositories {
      mavenDeployer {
        // ... other config here ...

        pom.whenConfigured { pom ->
          pom.dependencies.forEach { dep ->
            if (dep.getVersion() == "unspecified") {
              dep.setGroupId(GROUP)
              dep.setVersion(VERSION_NAME)
            }
          }
        }
      }
    }
  }
}

Вот пример рабочего проекта: https://github.com/hannesstruss/WindFish