如何从 gradle 编译中排除 kotlin 文件

Posted

技术标签:

【中文标题】如何从 gradle 编译中排除 kotlin 文件【英文标题】:How to exclude kotlin files from compiling with gradle 【发布时间】:2019-06-19 23:05:06 【问题描述】:

对于Java,我们是这样排除的:

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

我想用 kotlin 做同样的事情。 试图在配置 kotlin 的官方文档中找到一些关于此的文档,但没有成功。 我所期望并已经尝试过的(当然没有成功):

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

【问题讨论】:

您在同一目录中是否有测试和生产代码?在这种情况下,您最好按照默认项目布局拆分源目录,以将生产代码与测试代码分开。 docs.gradle.org/current/userguide/… @Simulant我有 /src 文件夹,我在其中保存 /main(生产代码)和 /tests。所以看起来在本指南中我有一个类似的结构 **/myTests/** 的实际路径是什么?正如@Simulant 所建议的那样,您的源集可以进行优化,或者您最终可能不需要此配置。 我刚刚发现,可以通过将 /myTests 文件夹移出 /src 来优化我的配置。所以这将是一个解决方案,似乎我也会这样做。但我认为 android-kotlin 插件不包含用于排除的 api 有点奇怪。似乎也可以使用 Kotlin DSL: kotlin.sourceSets main kotlin.exclude('...') 【参考方案1】:
java 
    srcDir 'src'
    exclude '**/myTests/*.kt'

没有 Kotlin 相关的配置。

我为什么这么说, 我将所有 kotlin 文件放入 kotlin 目录,将 java 文件放入 java 目录。但是在配置的时候,我放了

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

这意味着使用src/main/java 添加来自src/main/kotlin 的源文件也在编译时。

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

【讨论】:

exclude '/myTests/*.kt' 不会从 compile[flavourName]Kotlin gradle 任务中排除 kt 文件。我还有一个包含 kotlin 和 java 的混合文件夹,所以我不需要为 kotlin 包定义目录 见issuetracker.google.com/issues/155215177。似乎仍然无法排除文件或文件夹,即使在 AS 4.2 中也是如此。 谢谢,这很有帮助。我们可以告诉如何在这个包旁边显示(kotlin)吗?就像我们有(test),(androidTest)【参考方案2】:

Android(可能需要改进,看起来很不稳定):

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile.class).configureEach 
    it.exclude('**/TestExcludeKotlinClass.kt')

【讨论】:

【参考方案3】:

在这里使用其他解决方案的组合,使这项工作专门用于 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)。

这似乎是一种有点笨拙的方法,但它的工作原理是确保将测试目标排除在它实际上可以排除的所有任务(包括构建和 kapt 任务)之外。 sourceSets 排除对于不被拾取进行编译的文件仍然是必要的(我认为这是 Kotlin Gradle 插件,但它也可能是 Android Gradle 插件)。

【讨论】:

以上是关于如何从 gradle 编译中排除 kotlin 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gradle kts 中排除(忽略)android 构建变体

如何在Kotlin中使用Gradle构建缓存?

如何从 git 中排除打字稿编译的文件

如何使用 kotlin dsl Gradle 将编译器参数传递给 java Compiler

Kotlin 编译“错误:Android Gradle 插件仅支持 Kotlin Gradle 插件版本 1.3.0 及更高版本。”但 build.gradle 中没有 kotlin_version?

如何在实验 gradle 中排除 cpp 文件?