【问题标题】:How to exclude kotlin files from compiling with gradle如何从 gradle 编译中排除 kotlin 文件
【发布时间】: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('...')} }

标签: android android-studio gradle kotlin android-gradle-plugin


【解决方案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 插件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多