如何在Gradle中排除Kotlin文件的编译

6

使用Java,我们可以像这样进行排除:

java {
    srcDir 'src'
    exclude '**/myTests/**'
}

我希望用 Kotlin 制作同样的东西。

我试图在官方文档中找到有关配置 Kotlin 的文档,但没有任何进展。

我的期望和尝试过的(当然都无果):

kotlin {
    srcDir 'src'
    exclude '**/myTests/*.kt'
}

你的测试代码和生产代码是否在同一个目录下?如果是的话,最好根据默认项目布局拆分源目录,将生产代码与测试代码分离。https://docs.gradle.org/current/userguide/organizing_gradle_projects.html - Simulant
1
@Simulant 我有一个 /src 文件夹,其中我保留/主要(生产代码)和/tests。所以在这个指南中,我似乎有一个类似的结构。 - HeyAlex
“**/myTests/**” 的实际路径是什么?正如 @Simulant 所建议的那样,您的源集可能需要优化,或者最终您可能不需要这个配置。 - tynn
1
我刚刚发现,通过将/myTests文件夹移出/src文件夹,可以优化我的配置。因此这是一个解决方案,看起来我也会这样做。但我认为很奇怪的是,android-kotlin插件没有包含排除的API。同时,使用Kotlin DSL似乎也是可能实现的:kotlin.sourceSets{ main { kotlin.exclude('...')}}。 - HeyAlex
你们在谈论哪个文件?是 build.gradle 文件吗?还是其他文件或位置?它在哪里? - Peter Mortensen
我也遇到了这个问题。当应用插件:'org.jetbrains.kotlin.android'时,exclude 无法生效。非常悲伤。 - Victor Choy
4个回答

5
java {
    srcDir 'src'
    exclude '**/myTests/*.kt'
}

没有任何与Kotlin相关的配置。

为什么这么说:我把所有的Kotlin文件放在kotlin目录下,Java文件放在java目录下。但在配置时,我添加了:

sourceSets {
   main.java.srcDirs += "src/main/kotlin"
}

这意味着在编译时,src/main/java 中添加 src/main/kotlin 的源文件。

这应该可以解决您的问题。


1
排除'/myTests/*.kt'将不会从编译[flavourName]Kotlin gradle任务中排除kt文件。另外,我有一个混合的文件夹,其中包含kotlin和java文件,因此我不需要为kotlin包定义目录。 - HeyAlex
请参阅 https://issuetracker.google.com/issues/155215177。即使在 AS 4.2 中,仍然没有排除文件或文件夹的方法。 - Alex Cohn
谢谢,这非常有帮助。我们能否告诉如何在此包旁边显示(kotlin),就像我们有(test),(androidTest)一样。 - Arnab Kundu

4
安卓(可能需要改进,似乎不太稳定):
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile.class).configureEach {
    it.exclude('**/TestExcludeKotlinClass.kt')
}

1
这真的帮了我很多。我也遇到了同样的问题。当应用插件:'org.jetbrains.kotlin.android'时,源集排除不起作用。非常难过。 - Victor Choy

2
如果您使用的是Kotlin Gradle项目,请尝试以下操作:
tasks.withType<KotlinCompile> {
exclude("**/packageToExlude/**")}

在我的情况下,这是一个非Android项目。

那个应该放在哪里?在一个文件里吗?哪个文件? - Peter Mortensen
你把这些行放在 build.gradle.kts 文件中。 - rsobies

0

我发现了一种方法,可以使这个工作特别适用于Android单元测试(但我假设它是可适应的),使用其他解决方案的组合:

def filesToExclude = [
    '**/*TestOne*.kt',
    '**/*TestTwo*.kt',
    ...
]
tasks.withType(org.gradle.api.tasks.SourceTask.class).configureEach {
  it.exclude(filesToExclude)
}
android.sourceSets.test.kotlin.exclude(filesToExclude)

在我的情况下,由于其他生成(特别是使用kapt的Dagger),测试名称周围的额外通配符是必需的。
这似乎是一种有点hacky的方法,但它通过确保测试目标从所有它实际上可以排除的任务中排除(包括构建和kapt任务)来实现。源集排除仍然是必要的,以使文件不被编译(我认为这是Kotlin Gradle插件在做,但也可能是Android Gradle插件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接