如何在 .ktsKotlin 脚本文件中应用插件?

问题描述

Kotlin 脚本 (.main.kts) 文件旨在在一个独立文件中提供可执行的 Kotlin 代码,这对于编写脚本或在 StackOverflow 上共享代码片段等时非常方便。与此相反,目前几乎所有 Java/Kotlin 都使用带有神秘构建文件和深层文件夹结构的构建系统(例如 gradle)。

虽然我非常喜欢 Kotlin 脚本的想法,但它似乎很少被使用,只有 22 个问题关于 StackOverflow 和极其稀疏的文档和宝贵的谷歌搜索结果。我可以在实际脚本中使用 @file:DependsOn 而不是传统的构建文件来引入依赖项:

build.gradle

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0'
}

foo.main.kts

@file:DependsOn("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")

但是,我找不到在我的 .main.kts 文件中使用“应用插件”的方法。我在网上找到的任何代码片段中都没有使用它。

build.gradle

apply plugin: 'kotlinx-serialization'

foo.main.kts

???

作为参考,我在下面附上了 MWE。错误消息指出类 Node 不可序列化,但正如所指出的 in this question 该消息具有误导性,并且 apply plugin 缺失的实际问题,我不知道如何在 build.gradle 文件之外使用:

@file:DependsOn("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")

import kotlinx.serialization.decodeFromString
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class Node (val numbers: List<Int>)

val h = Json.decodeFromString<Node>(""" {"numbers": [1,2,3]} """)

在 Ubuntu 上运行:

snap install kotlin
kotlin foo.main.kts

解决方法

kotlinx-serialization 是一个 Gradle 插件,它添加到管道同名编译器插件 - 它为用 serializer() 注释的类生成 @Serializable 方法。

当您使用 kotlinc 编译器编译 Kotlin 代码时,您可以通过使用 -Xplugin=/snap/kotlin/current/lib/kotlinx-serialization-compiler-plugin.jar 编译器选项提供其 JAR 文件(它与编译器捆绑在一起)的路径来附加插件。

对于 .kts 文件,有一个 @file:CompilerOptions 注释,但目前(在 Kotlin 1.5.10 中)不支持此特定键 (warning: the following compiler arguments are ignored on script compilation: -Xplugin)

命令行

您可以在命令行中使用

kotlinc -script -Xplugin="/snap/kotlin/current/lib/kotlinx-serialization-compiler-plugin.jar" foo.main.kts

脚本标题

作为一种解决方法,您可以使用此shebang:

#!/usr/bin/env -S kotlinc -script -Xplugin="/snap/kotlin/current/lib/kotlinx-serialization-compiler-plugin.jar"

要运行您的脚本,您需要将其转换为可执行文件:

chmod u+x foo.main.kts

现在可以运行:

./foo.main.kts

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...