Вопрос
Как настроить зависимости модулей в проекте 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
)