Учитывая следующие три проекта (foo, bar и app), где приложение зависит от bar, зависит от foo, я хотел бы иметь возможность просто установить bar в приложении проекта и автоматически установить библиотеку foo. Это правильно работает со следующими скриптами:
Проект 'foo' build.gradle
plugins {
id "maven-publish"
}
repositories {
mavenLocal()
}
group = "com.test2.foo"
version = "0.0.1"
def distZip = file("${buildDir}/dist.zip")
def distFile = file("${buildDir}/Foo.txt")
tasks.register("createDistFile") {
outputs.file(distFile)
doLast {
distFile.delete()
distFile.parentFile.mkdirs()
distFile.text = "foo output 1"
}
}
tasks.register("assembleZip", Zip) {
dependsOn "createDistFile"
from distFile
archiveName = distZip.name
destinationDir distZip.parentFile
}
publishing {
publications {
main(MavenPublication) {
artifact(distZip) {
builtBy tasks.named("assembleZip")
}
}
}
repositories {
mavenLocal()
}
}
Проект 'bar' build.gradle
plugins {
id "maven-publish"
id "base"
}
repositories {
mavenLocal()
}
group = "com.test2.bar"
version = "0.0.1"
def distZip = file("${buildDir}/dist.zip")
def distFile = file("${buildDir}/Bar.txt")
tasks.register("createDistFile") {
outputs.file(distFile)
doLast {
distFile.delete()
distFile.parentFile.mkdirs()
distFile.text = "bar output 2"
}
}
tasks.register("assembleZip", Zip) {
dependsOn "createDistFile"
from distFile
archiveName = distZip.name
destinationDir distZip.parentFile
}
artifacts {
"default" distZip, {
builtBy tasks.named("assembleZip")
}
}
publishing {
publications {
main(MavenPublication) {
artifact(distZip) {
builtBy tasks.named("assembleZip")
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', "com.test2.foo")
dependencyNode.appendNode('artifactId', "foo")
dependencyNode.appendNode('version', "0.0.1")
}
}
}
}
repositories {
mavenLocal()
}
}
Project 'app 'build.gradle
repositories {
mavenLocal()
}
configurations {
api
}
dependencies {
api "com.test2.bar:bar:0.0.1"
// This should be automatically installed when bar is installed
// api "com.test2.foo:foo:0.0.1"
}
tasks.register("installLibs", Copy) {
dependsOn configurations.api
destinationDir = file("${buildDir}/libs")
configurations.api.each { config ->
from zipTree(config)
}
doFirst {
destinationDir.deleteDir()
}
}
Проблема
При использовании вышеуказанных сценариев это можно проверить, запустив installLibs
в приложении проекта и проверив, что Bar.txt
и Foo.txt
устанавливаются в каталог build/libs
.
Однако, если я изменю файл settings.gradle
в проекте приложения на следующий:
rootProject.name = 'app'
includeBuild '[PATH TO BAR PROJECT]'
Тогда, если я запусту ./gradle installLibs
снова для проекта приложения, я обнаружил, что Foo.txt
больше не установлен. Есть ли способ вручную указать эти метаданные сборки для панели проекта, чтобы при включении его с includeBuild включались его транзитивные зависимости?