Транзитивные зависимости не обнаруживаются при использовании составных сборок с пользовательскими метаданными publi sh - PullRequest
1 голос
/ 17 февраля 2020

Учитывая следующие три проекта (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 включались его транзитивные зависимости?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...