посмотрите, поможет ли приведенный ниже подход. предполагается, что проект состоит из трех модулей, например:
Top-level
├── Project-1
├── Project-2
└── Project-3
... и различные версии Guava берут на себя роль Module-A
, как вы описали настройку.
Верхний уровень build.gradle
:
ext {
project1GuavaVersions = ['26.0-jre','27.0-jre']
project2GuavaVersions = ['25.0-jre','26.0-jre']
if(project1GuavaVersions.disjoint(project2GuavaVersions)) {
throw new GradleException('No common version(s) of Guava defined')
} else {
project3GuavaVersion = new HashSet(project1GuavaVersions + project2GuavaVersions).max()
}
subprojects {
apply plugin: 'java'
}
дополнительные свойства, используемые для указания допустимых версий Guava для каждого модуля. Версия Project-3 рассчитывается как последняя версия, используемая между Project-1 и Project-2. (дополнительно для удобства к трем подпроектам применяется плагин Java).
Проект-1 build.gradle
:
archivesBaseName = 'project1'
repositories {
mavenCentral()
}
dependencies {
implementation "com.google.guava:guava:[${project1GuavaVersions.join(',')}]"
}
дополнительное свойство для версий Project-1 Guava интерполируется и преобразуется из списка строк в строку с разделителями-запятыми. это использует способность Gradle использовать нотацию Ivy для указания диапазона версий, то есть [26.0-jre,27.0-jre]
.
Проект-2 build.gradle
:
archivesBaseName = 'project2'
repositories {
mavenCentral()
}
dependencies {
implementation "com.google.guava:guava:[${project2GuavaVersions.join(',')}]"
}
(аналогичная реализация Project-1)
Проект-3 build.gradle
:
archivesBaseName = 'project3'
repositories {
mavenCentral()
}
dependencies {
implementation project(':project1')
implementation project(':project2')
implementation "com.google.guava:guava:$project3GuavaVersion"
}
Project-1 и Project-2 определяются как зависимости на уровне проекта, и здесь используется явно рассчитанная версия для Guava, определенная как дополнительное свойство.
я надеюсь, что охватывает все. по крайней мере, я надеюсь, что это вдохновит на новые мысли!
ОБНОВЛЕНИЕ
как вы упомянули в комментариях, что ваши проекты не настроены иерархически, у вас также есть возможность настроить их в «плоском» расположении, в котором все проекты существуют в одной и той же папке, например так:
(root)
├── project1
│ └── build.gradle
├── project2
│ └── build.gradle
├── project3
│ └── build.gradle
└── master
├── build.gradle
└── settings.gradle
«мастер» здесь — это специально названный проект, который находится рядом с другими проектами. settings.gradle
следует переместить в master
и использовать Settings.includeFlat()
, чтобы указать, что вы хотите включить проекты, существующие на одном уровне:
includeFlat 'project1'
includeFlat 'project2'
includeFlat 'project3'
детали моего первоначально предложенного решения должны быть применимы к этой настройке.
04.11.2018
project1GuavaVersions = ['27.0-jre','28.0-jre']
, я хочу, чтобы сборкаproject3
не удалась, так как нет общей версии, которая могла бы удовлетворить все зависимости. 06.11.2018