Мой проект использует несколько исходных наборов Gradle для своей базы производственного кода вместо просто main
:
domain
dal
rest
test
dbUnitTest
Это оказалось очень полезным для ограничения зависимостей и обеспечения разделения интересов.
Это однако имеет один недостаток: мы не можем получить доступ к классам или методам с visibility internal
из тестовых классов. Причина этого заключается в том, что Kotlin компилятор помещает каждый исходный набор в свой собственный "модуль":
$ find . -name '*.kotlin_module'
./classes/kotlin/domain/META-INF/contact-management_domain.kotlin_module
./classes/kotlin/dal/META-INF/contact-management_dal.kotlin_module
./classes/kotlin/rest/META-INF/contact-management_dal.kotlin_module
./classes/kotlin/test/META-INF/contact-management.kotlin_module
./classes/kotlin/dbUnitTest/META-INF/contact-management_dbUnitTest.kotlin_module
Я бы хотел, чтобы все исходные наборы использовали то же имя модуля "contact-management", что и по умолчанию основной набор будет.
Я попытался переопределить имя с помощью опции компилятора -module-name
:
tasks.withType<KotlinCompile> {
kotlinOptions {
// place all source sets in the same kotlin module, making objects with 'internal' visibility available to every source sets of this project
freeCompilerArgs += listOf("-module-name \"contact-management\")
}
}
После запуска gradlew build
я получаю
> Task :contact-management:compileDomainKotlin FAILED
e: Invalid argument: -module-name "contact-management"
Причина в том, что -module-name "contact-management_domain"
устанавливается ранее кодом Gradle, вызывающим также компилятор Kotlin, но, очевидно, эта опция принимается только один раз.
In сборка Gradle, как я могу контролировать то, что компилятором Kotlin считается *1045* "одним модулем"?
A связанный вопрос где test
исходный набор, подлежащий разделению, пока не дал удовлетворительных ответов.