Saltar al contenido

Compilador Kotlin

Compile Kotlin 2.5 con elide kotlinc o en la compilación de un proyecto de Elide, con plugins de compilador integrados como serialization y Metro, y JAR de ABI.

En esta página

Elide incluye Kotlin 2.5.0-Beta1. Una distribución solo de ejecución indica que kotlinc necesita la distribución completa.

Compilar archivos fuente

// Hello.kt
fun main() = println("Hello!")
elide kotlinc -- -d out Hello.kt
elide java -- -cp out HelloKt
0:12 / 0:12

Las opciones de kotlinc van después de --; las de Elide, antes. elide kotlinc --help lista las de Elide; elide kotlinc -- -help, las de kotlinc.

elide java no añade la biblioteca estándar de Kotlin, así que el código que la usa (listOf, joinToString) falla ahí:

fun main() = println(listOf("Hello", "Kotlin").joinToString(" "))
ComandoResultado
elide kotlinc -- -d out Hello.kt y después elide java -- -cp out HelloKtNoClassDefFoundError: kotlin/collections/CollectionsKt
elide kotlinc -- -include-runtime -d hello.jar Hello.ktLa compilación falla
elide run Hello.ktHello Kotlin
elide build con un artefacto Jvm.JvmApplicationScript de inicio con la biblioteca estándar en lib/

Opciones de Elide

OpciónPropósito
--incrementalGuardar el estado incremental en .dev/artifacts/kotlinc/incremental/, indexado por la ruta de salida.
--incremental-cache-dir DIRGuardar el estado incremental en DIR.
--plugins LISTHabilitar exactamente estos plugins integrados: metro, serialization, atomicfu, power-assert.
--metro, --no-metroForzar la activación o desactivación del plugin de DI Metro.
--testsHabilitar los plugins de pruebas (power-assert).
--max-errors NErrores que se muestran; 0 los muestra todos. Las advertencias se deduplican y nunca se limitan.
--report-used-deps PATHEscribir las entradas del classpath a las que hace referencia la salida (strict deps de Bazel).
--persistent_workerEjecutarse como worker persistente de Bazel, en modo singleplex o multiplex.
--abi-onlyExperimental: escribir solo un JAR de ABI en -d.

JAR de ABI

elide kotlinc --abi-only -- -d header.jar src/**/*.kt

El JAR contiene las firmas públicas y protegidas, @Metadata, los cuerpos inline relevantes para la ABI, los valores const y los marcadores de argumentos predeterminados. Una ABI sin cambios produce un JAR idéntico byte a byte, así que los cambios en los cuerpos mantienen en caché a los dependientes.

ELIDE_KOTLINC_ABI_STRIP=1 omite la generación de código de los cuerpos. Déjela sin definir cuando la ABI incluya declaraciones generadas por plugins, como el $serializer de kotlinx.serialization. Los workers la aceptan por solicitud.

Compilar proyectos

elide build compila los conjuntos de fuentes de Kotlin encontrados por convención o declarados en elide.pkl.

kotlin {
  apiLevel = "auto"
  languageLevel = "auto"
  compilerOptions {
    allWarningsAsErrors = true
    optIn { "kotlin.time.ExperimentalTime" }
    freeCompilerArgs { "-Xcontext-parameters" }
  }
}
PropiedadSignificadoValor predeterminado
kotlin.apiLevel, kotlin.languageLevel"1.9" … "2.5", "latest" o "stable"."auto"
compilerOptions.optInMarcadores que se pasan como -opt-in.ninguno
compilerOptions.progressiveMode, .extraWarnings, .allWarningsAsErrors, .suppressWarnings, .verboseLas opciones correspondientes de kotlinc.false
compilerOptions.freeCompilerArgsArgumentos adicionales del compilador.ninguno
compilerOptions.apiVersion, .languageVersion, .jvmTargetVersiones por compilación; "auto" sigue al proyecto."auto"
compilerOptions.javaParametersEmitir metadatos de parámetros para la reflexión de Java.false
compilerOptions.jvmTargetValidationMode"ERROR", "WARNING" o "IGNORE" ante una discrepancia entre los destinos de Kotlin y Java."ERROR"
compilerOptions.noStdlib, .noJdkQuitar la biblioteca estándar o el JDK del classpath.false
compilerOptions.includeRuntimeNo compatible: true hace fallar la compilación de Kotlin. Empaquete con un artefacto Jvm.JvmApplication.false
compilerOptions.incrementalCompilaciones incrementales del proyecto.true

Cada compilación escribe sus argumentos en kotlinc.args, junto a su salida.

Plugins y funciones

kotlin.featuresEfectoValor predeterminado
kotlinxBibliotecas KotlinX en las raíces de dependencias de Kotlin.true
defaultPluginsConjunto de plugins integrados.true
serializationPlugin y runtime de kotlinx.serialization.kotlinx && defaultPlugins
coroutinesRuntime de kotlinx.coroutines.kotlinx
atomicfuPlugin y runtime de kotlinx.atomicfu.kotlinx && defaultPlugins
powerAssertPlugin Power Assert.defaultPlugins
metroPlugin de DI Metro.defaultPlugins
reflectionkotlin-reflect implícito.true
testingBibliotecas de pruebas de Kotlin en los conjuntos de pruebas.true
kotlin {
  features {
    metro = false
  }
  plugins {
    ["org.jetbrains.kotlinx.serialization"] {
      ["mode"] = "json"
    }
  }
}

dependencies {
  maven {
    kotlinPlugins { "com.example:my-compiler-plugin:1.0.0" }
  }
}
  • Cada entrada de plugins se convierte en -P plugin:<id>:<key>=<value>, en orden de id y clave.
  • Los plugins de terceros van en el grupo kotlinPlugins y necesitan un ManagedKotlinToolchain o un CustomKotlinToolchain. El compilador integrado avisa con Custom Kotlin compiler plugins are not supported when using the embedded compiler, plugins will not be applied y compila sin ellos.
  • Un plugin integrado que falta en la distribución se omite, junto con sus opciones, con una advertencia.
  • Las bibliotecas implícitas de Kotlin solo se añaden a las raíces de dependencias con fuentes Kotlin. reflection = false quita kotlin-reflect; compilerOptions.noStdlib = true quita esa biblioteca y la estándar. Las dependencias declaradas se mantienen.
  • project("core").friend() expone las declaraciones internal de un proyecto hermano; consulte Espacios de trabajo.
  • Un conjunto de fuentes ve las declaraciones internal de los conjuntos de los que depende en el mismo proyecto: todos los nombrados en su dependsOn (main para un conjunto de pruebas que lo omite), junto con los conjuntos de los que estos dependen.

Elegir una cadena de herramientas

import "elide:Kotlin.pkl" as Kotlin

kotlin {
  toolchain = "embedded"                                       // the default
  // toolchain = new Kotlin.ManagedKotlinToolchain { version = "2.4.0" }
  // toolchain = new Kotlin.CustomKotlinToolchain { path = "/opt/kotlinc" }
}
Cadena de herramientasComportamiento
"embedded"El Kotlin incluido en Elide.
ManagedKotlinToolchainDescarga esa versión (también las preliminares) con su biblioteca estándar, reflect, bibliotecas de pruebas y plugins de Kotlin. Las versiones de KotlinX, Metro y otros terceros no cambian; compruebe que coincidan.
CustomKotlinToolchainUna distribución local de Kotlin; se omiten los plugins integrados que le falten.

La cadena de herramientas se aplica a las compilaciones de proyectos; elide kotlinc usa siempre el compilador incluido.

KAPT y KSP no son compatibles. El código Kotlin que usa tipos Java generados debe obtenerlos de un conjunto de fuentes o proyecto anterior.

Ejemplos

Empiece desde una plantilla:

elide init --template ktjvm       # Kotlin app with a test

¿Te resultó útil esta página?