Многопроектная сборка Gradle с развязанными проектами: как заменить зависимость для проекта, не являющегося родным Java? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть проект Gradle, структурированный следующим образом:

wa-arm-spring-selector
\-core
\-data
\-ws

Хотя они зависят друг от друга, каждый подпроект отделен и может быть выполнен отдельно с использованием общего репозитория Maven на основе файловой системы.генерируется в папке сборки корневого проекта для совместного использования зависимостей.Это поддерживает развязку проектов, что мне нравится, однако, в нем возникает необходимость иметь репозиторий Maven, который необходим только потому, что каждый подпроект не знает о своих братьях и сестрах.При отдельном выполнении это имеет смысл, но я бы хотел иметь возможность выполнить корневой проект и заменить зависимости так, чтобы это репозиторий Maven не требовалось.

Теперь я написал сегмент замены зависимостеймоего корневого проекта для достижения этой цели:

// Replace local module dependencies with project dependencies if the project exists
allprojects {
  configurations.all {
    resolutionStrategy.dependencySubstitution.all { DependencySubstitution dependency ->
      if (dependency.requested instanceof ModuleComponentSelector && dependency.requested.group == "wa.arm.springselector") {
        def targetProject = findProject(":${dependency.requested.module}")
        if (targetProject != null) {
          println "Substituting dependency for project " + targetProject.getName();
          dependency.useTarget(targetProject, "Substituted dependency for local project as it exists")
        }
      }
    }
  }
}

Хотя это должно работать для кросс-проектных стандартных опубликованных зависимостей артефактов, похоже, что это не работает для моего проекта «данных».

Проект «data» создает артефакт TARed / GZIPped, который, по сути, представляет собой просто CSV-данные, необходимые для проектов «core» и «ws» во время выполнения.Зависимость записывается в «ядро» следующим образом:

configurations {
    data { transitive = false }
}
dependencies {
    data 'wa.arm.springselector:data:+'
}

В проекте данных это получается следующим образом:

configurations {
  data
}

publishing {
  publications {
    data(MavenPublication) {
      afterEvaluate {
        artifact bundleCSVTar
      }
    }
  }

  repositories {
    maven {
      name = 'onMachineRepo'
      url = localServerRepoURL
    }
  }
}

task bundleCSVTar(type: Tar) {
  group 'distribution'
  description 'Bundle the output CSV for distribution as a TAR GZ ball'
  compression 'gzip'
  from compileCSVs.outputs
}

artifacts {
  // Define that output artifact for the csvs configuration is produced by the bundleCSVTar task
  data bundleCSVTar
}

Все это прекрасно работает, когда я публикую артефактыот каждого подпроекта в отдельности, но как только я использую корневой проект и начинается замена, я получаю следующую ошибку, до которой я не смог добраться до сути.Я вроде понимаю, что он говорит, но я не знаю, как связать артефакт, который я создаю в моем проекте данных, с конфигурацией «по умолчанию», о которой идет речь.

> Configure project :core
Substituting for project data

FAILURE: Build failed with an exception.

* Where:
Build file 'D:\Documents\wa-arm-spring-selector\core\build.gradle' line: 115

* What went wrong:
A problem occurred evaluating project ':core'.
> Could not resolve all files for configuration ':core:data'.
   > Could not resolve wa.arm.springselector:data:+.
     Required by:
         project :core
      > Project :core declares a dependency from configuration 'data' to configuration 'default' which is not declared in the descriptor for project :data.

Любые идеи о том, какправильно создать эту ассоциацию (я попытался просто переименовать мою конфигурацию данных в проекте «data» в «default», но это не сработало) или есть идеи, как лучше реализовать замену, чтобы эта проблема исчезла?

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