我的项目使用多个 Gradle 源集作为其生产代码库,而不仅仅是main
:
domain
dal
rest
test
dbUnitTest
事实证明,这对于限制依赖关系和执行关注点分离非常有用。
然而,它有一个缺点:我们无法从测试类中访问具有可见性的类或方法。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
我希望所有源集都使用相同的模块名称“联系人管理”,因为默认情况下主源集。
我试图用编译器选项覆盖名称-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"
是之前由调用 Kotlin 编译器的 Gradle 代码设置的,但显然这个选项只被接受一次。
在 Gradle 构建中,如何控制Kotlin 编译器认为是“一个模块”的内容?
到目前为止,要拆分源集的相关问题还没有令人满意的答案。test