Kotlin Gradle 插件中的编译器选项

每个 Kotlin 的发行版本都包含对于以下目标代码的编译器: JVM、JavaScript,以及支持平台的本地二进制文件。

这些编译器会在这些步骤中被调用:

  • IDE,当你在你的 Kotlin 项目上点击编译运行按钮时。
  • Gradle,当你在控制台或者 IDE 上调用 gradle build 命令时。
  • Maven,当你在控制台或者 IDE 上调用 mvn compile 或者 mvn test-compile命令时。

你也可以用命令行手动调用 Kotlin 编译器, 详见使用命令行编译器教程。

配置选项

Kotlin 编译器有一系列用于控制编译过程的参数。

通过构建脚本,你可以指定额外的编译选项。使用 Kotlin 编译任务中的 compilerOptions 属性来指定。 例如:

【Kotlin】

  1. tasks.named("compileKotlin", org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask::class.java) {
  2. compilerOptions {
  3. freeCompilerArgs.add("-Xexport-kdoc")
  4. }
  5. }

【Groovy】

  1. tasks.named('compileKotlin', org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask.class) {
  2. compilerOptions {
  3. freeCompilerArgs.add("-Xexport-kdoc")
  4. }
  5. }

面向 JVM

JVM 环境下的编译任务,对于生产代码叫做 compileKotlin,而对于测试代码则叫做 compileTestKotlin。对于自定义源代码集(source set),这些任务命名遵循 compile<Name>Kotlin 模式。

Android 项目中的任务名称包含构建变体 <—! —>名称,并遵循 compile<BuildVariant>Kotlin 的模式,例如 compileDebugKotlincompileReleaseUnitTestKotlin

对于 JVM 项目和 Android 项目,都可以通过项目的 Kotlin 扩展 DSL 去配置选项。

【Kotlin】

  1. kotlin {
  2. compilerOptions {
  3. apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
  4. }
  5. }

【Groovy】

  1. kotlin {
  2. compilerOptions {
  3. apiVersion = org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
  4. }
  5. }

有几点是需要注意的:

  • android.kotlinOptionskotlin.compilerOptions 这两个配置会相互覆写。只有最新(即最下面)的一个会生效。
  • kotlin.compilerOptions 会影响项目中所有 Kotlin 编译任务的配置。
  • 对于那些应用到 kotlin.compilerOptions 的任务,你可以通过 tasks.named<KotlinJvmCompile>("compileKotlin") { }(或者 tasks.withType<KotlinJvmCompile>().configureEach { })来覆写配置。

面向 JavaScript

JavaScript 的编译任务,对于生产代码叫做 compileKotlinJs,对于测试代码叫做 compileTestKotlinJs。 对于自定义源代码集(source set),这些任务命名遵循 compile<Name>KotlinJs 模式。

要配置单个任务,请使用其名称:

【Kotlin】

  1. import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
  2. // ……
  3. val compileKotlin: KotlinCompilationTask<*> by tasks
  4. compileKotlin.compilerOptions.suppressWarnings.set(true)

【Groovy】

  1. import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
  2. // ……
  3. tasks.named('compileKotlin', KotlinCompilationTask) {
  4. compilerOptions {
  5. suppressWarnings.set(true)
  6. }
  7. }

请注意,对于 Gradle Kotlin DSL,首先从项目的 tasks 中获取任务。

相应地,为 JS 与公共目标使用类型 Kotlin2JsCompileKotlinCompileCommon

适用于全局的 Kotlin 编译任务

你也可以在项目中对所有的 Kotlin 编译任务进行配置:

【Kotlin】

  1. import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
  2. // ……
  3. tasks.named<KotlinCompilationTask<*>>("compileKotlin").configure {
  4. compilerOptions { /*……*/ }
  5. }

【Groovy】

  1. import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
  2. // ...
  3. tasks.named('compileKotlin', KotlinCompilationTask) {
  4. compilerOptions { /*……*/ }
  5. }

所有编译器选项

这里列出了 Gradle 任务的完整选项列表:

常规属性

名称描述可能的值默认值
optIn用于配置选择加入的编译器参数的列表listOf( / opt-ins / )emptyList()
progressiveMode启用渐进式编译器模式true, falsefalse

JVM 特有的属性

名称描述可能的值默认值
javaParameters为方法参数生成 Java 1.8 反射的元数据false
jvmTarget生成的 JVM 字节码的目标版本“1.8”、”9”、”10”、……、”20”。另见编译器选项的类型“1.8”
noJdk不要自动在类路径中包含 Java 运行时false
jvmTargetValidationMode
  • 验证 Kotlin 和 Java 之间 JVM 目标的兼容性
  • 该编译器选项属于 KotlinCompile 任务
  • WARNING, ERROR, INFOERROR

    JVM、JS 与 JS DCE 的公共属性

    名称描述可能的值默认值
    allWarningsAsErrors任何警告都报告为错误false
    suppressWarnings不生成警告false
    verbose启用详细日志输出。仅在已启用 Gradle debug 日志时才有效false
    freeCompilerArgs附加编译器参数的列表。你也可以在这里使用实验性的-X参数。见[]

    我们计划在今后的发行版本中将freeCompilerArgs选项弃用。如果你因此无法在 Kotlin Gradle DSL 中配置某些选项 请提出一个 Issue

    Kotlin Gradle 插件中的编译器选项 - 图1

    通过 freeCompilerArgs 选项配置额外的参数的示例

    通过使用 freeCompilerArgs 来应用包括实验性参数在内的额外编译器参数。你可以在这个属性中加入一个单独的编译器参数或者一个编译器参数的列表。

    【Kotlin】

    1. import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
    2. // ...
    3. val compileKotlin: KotlinCompilationTask<*> by tasks
    4. // 单个实验性参数
    5. compileKotlin.compilerOptions.freeCompilerArgs.add("-Xexport-kdoc")
    6. // 单个附加参数,可以是键值对
    7. compileKotlin.compilerOptions.freeCompilerArgs.add("-Xno-param-assertions")
    8. // 参数列表
    9. compileKotlin.compilerOptions.freeCompilerArgs.addAll(listOf("-Xno-receiver-assertions", "-Xno-call-assertions"))

    【Groovy】

    1. import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
    2. // ...
    3. tasks.named('compileKotlin', KotlinCompilationTask) {
    4. compilerOptions {
    5. // 单个实验性参数
    6. freeCompilerArgs.add("-Xexport-kdoc")
    7. // 单个附加参数,可以是键值对
    8. freeCompilerArgs.add("-Xno-param-assertions")
    9. // 参数列表
    10. freeCompilerArgs.addAll(["-Xno-receiver-assertions", "-Xno-call-assertions"])
    11. }
    12. }

    JVM 与 JS 的公共属性

    名称描述可能的值默认值
    apiVersion限制只使用来自内置库的指定版本中的声明“1.4”(已弃用)、 “1.5”、 “1.6”、 “1.7”、 “1.8”、 “1.9”、 “2.0”(实验性的)、 “2.1”(实验性的)
    languageVersion提供与指定 Kotlin 版本源代码级兼容“1.4”(已弃用)、 “1.5”、 “1.6”、 “1.7”、 “1.8”、 “1.9”、 “2.0”(实验性的)、 “2.1”(实验性的)

    设置 languageVersion 的示例

    要设置语言的版本,请使用如下格式的语法:

    【Kotlin】

    1. tasks
    2. .withType<org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile>()
    3. .configureEach {
    4. compilerOptions
    5. .languageVersion
    6. .set(
    7. org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
    8. )
    9. }

    【Groovy】

    1. tasks
    2. .withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask.class)
    3. .configureEach {
    4. compilerOptions.languageVersion =
    5. org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
    6. }

    另见编译器选项的类型

    JS 特有的属性

    名称描述可能的值默认值
    friendModulesDisabled禁用内部声明导出false
    main定义是否在执行时调用 main 函数“call”、”noCall”。另见编译器选项的类型“call”
    metaInfo使用元数据生成 .meta.js 与 .kjsm 文件。用于创建库true
    moduleKind编译器生成的 JS 模块类型“umd”、”commonjs”、”amd”、”plain”、”es”。另见编译器选项的类型“umd”
    outputFile编译结果的目标 *.js 文件“\/js/packages/\/kotlin/\.js”
    sourceMap生成源代码映射(source map)true
    sourceMapEmbedSources将源代码嵌入到源代码映射中“never”、”always”、”inlining”。另见编译器选项的类型
    sourceMapNamesPolicy将 Kotlin 代码中声明的变量和函数添加到源代码映射中。详见编译器引用“simple-names”、”fully-qualified-names”、”no”。另见编译器选项的类型“simple-names”
    sourceMapPrefix将指定前缀添加到源代码映射中的路径
    target生成指定 ECMA 版本的 JS 文件“v5”“v5”
    typedArrays将原生数组转换为 JS 带类型数组true

    编译器选项的类型

    一些 compilerOptions 使用独有的类型来替代字符串类型

    选项类型例子
    jvmTargetJvmTargetcompilerOptions.jvmTarget.set(JvmTarget.JVM_11)
    apiVersion and languageVersionKotlinVersioncompilerOptions.languageVersion.set(KotlinVersion.KOTLIN_2_0)
    mainJsMainFunctionExecutionModecompilerOptions.main.set(JsMainFunctionExecutionMode.NO_CALL)
    moduleKindJsModuleKindcompilerOptions.moduleKind.set(JsModuleKind.MODULE_ES)
    sourceMapEmbedSourcesJsSourceMapEmbedModecompilerOptions.sourceMapEmbedSources.set(JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_INLINING)
    sourceMapNamesPolicyJsSourceMapNamesPolicycompilerOptions.sourceMapNamesPolicy.set(JsSourceMapNamesPolicy.SOURCE_MAP_NAMES_POLICY_FQ_NAMES)

    下一步做什么?

    了解更多关于: