Как исключить файлы kotlin из компиляции с помощью gradle

С Java мы исключаем вот так:

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

Я хочу сделать то же самое с Kotlin. Попытка найти некоторые документы по этому вопросу в официальной документации по настройке kotlin безуспешно. Что я ожидал и уже попробовал (и, конечно, безуспешно):

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

4 ответа

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

Конфигурация, связанная с Kotlin, отсутствует.

Почему я говорю это, у меня есть все файлы kotlin в каталог kotlin и файлы java в каталог java. Но при настройке я поставил

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

это означает, что с src/main/java добавить исходные файлы из src/main/kotlin также во время компиляции.

Это должно решить вашу проблему.

Android (вероятно, нуждается в улучшении, кажется нестабильным):

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

Если вы используете проект Kotlin Gradle, попробуйте следующее:

      tasks.withType<KotlinCompile> {
exclude("**/packageToExlude/**")}

В моем случае проект не для Android.

Нашел способ сделать эту работу специально для модульных тестов 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)

В моем конкретном случае дополнительные символы подстановки вокруг имени теста были необходимы из-за возникновения другого поколения (в частности, Dagger с kapt).

Это кажется немного хакерским подходом, но он работает, гарантируя, что тестовая цель исключена из всех задач, из которых она действительно может быть исключена (включая задачи сборки и kapt). Исключение sourceSets по-прежнему необходимо, чтобы файл не собирался для компиляции (я думаю, что это делает плагин Kotlin Gradle, но это также может быть плагин Android Gradle).

Другие вопросы по тегам