Gradle: включить один и тот же SourceSet в несколько подпроектов
Как мне добавить один исходный набор в несколько подпроектов?
Во-первых... да, я знаю, насколько это смешно. Это просто то, что я должен делать.
Установка
- В проекте используется Groovy DSL.
- Есть 3 подпроекта (A,B,C), каждый из которых имеет собственный уникальный основной исходный набор.
- Есть 5 дополнительных исходных кодов (1, 2, 3, 4, 5), внешних по отношению к этим проектам.
- Nonce внешних исходных кодов можно скомпилировать отдельно.
- Все исходные наборы зависят от интерфейса, который определяется 3 раза в каждом подпроекте.
- Основной источник подпроекта не может зависеть ни от одного из внешних источников.
- 1 и 2 необходимо скомпилировать с помощью A, B и C.
- 3 необходимо скомпилировать с A, а также с B.
- 4 должен быть скомпилирован с B, а также с C
- 5 нужно компилировать только с C.
- 4 и 5 должны зависеть от класса, определенного в 2.
- 5 должен быть автономным набором исходных текстов, чтобы его можно было включить в качестве исходного набора в любые будущие подпроекты, которые могут быть добавлены.
- Ни один из внешних источников не может включать источники из любого другого набора источников.
- Ни один из внешних источников не может быть собран отдельно.
- Ни один из внешних источников не может быть включен в качестве зависимости от jar-файла или проекта; они ДОЛЖНЫ быть включены как исходный набор, и они ДОЛЖНЫ быть скомпилированы отдельно для каждого подпроекта, который их включает.
А
sourceSets {
main {
java {
srcDirs = ["src",
"$rootDir/source_sets/1/src",
"$rootDir/source_sets/2/src",
"$rootDir/source_sets/3/src"
]
}
}
}
B
sourceSets {
main {
java {
srcDirs = ["src",
"$rootDir/source_sets/1/src",
"$rootDir/source_sets/2/src",
"$rootDir/source_sets/3/src",
"$rootDir/source_sets/4/src"
]
}
}
}
C
sourceSets {
main {
java {
srcDirs = ["src",
"$rootDir/interfaces/source_sets/1/src",
"$rootDir/interfaces/source_sets/2/src",
"$rootDir/interfaces/source_sets/4/src",
"$rootDir/interfaces/source_sets/5/src"
]
}
}
}
settings.gradle
include(":interfaces/A")
project(":interfaces/A").name = "A"
include(":interfaces/A")
project(":interfaces/A").name = "A"
include(":interfaces/A")
project(":interfaces/A").name = "A"
Проблема в том, что 4 и 5 не могут найти класс в 2, а моя IDE (IntelliJ) не может определить правильный путь к классам.
На самом деле мне нужно, чтобы внешние исходные наборы действовали так, как если бы их было 3 отдельные копии, а на самом деле не было 3 отдельных копий, и мне нужно сделать это без использования символических / программных ссылок.
Решение должно использовать только gradle, но оно может использовать плагин JetBrains "idea" для gradle, если оно не включает фиксацию каких-либо файлов в папке ".idea", но может включать встроенный xml или файлы в папке ресурсов. вне папки.idea.
Так что да... это слишком сложно и просто... тьфу! Но так оно и есть.
1 ответ
Ох уж действительно.
У меня нет ответа, но это слишком долго, чтобы оставлять комментарии. Итак, начнем.
Я предполагаю, что это проблема только с IntelliJ, а не при компиляции с Gradle, верно? Если это так, вам следует попробовать смоделировать свой проект в IntelliJ так, как вы этого хотите, и как только вы найдете способ сделать это, выясните, как использовать плагин Customize Idea, чтобы сделать это за вас.
Однако я почти уверен, что у вас не может быть нескольких модулей в IntelliJ с одним и тем же "корнем содержимого". Итак, я вижу только те параметры, которые вам не нужны - либо копировать (синхронизировать) источники с новой папкой, используемой только для IntelliJ (что не допускает модификации), либо создавать символические ссылки (которые не всегда Portable) или реструктурировать ваши внешние источники, чтобы их можно было компилировать независимо (что может быть нелегко)
:-(