У меня есть проект 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», но это не сработало) или есть идеи, как лучше реализовать замену, чтобы эта проблема исчезла?