标签: kotlin-script

Gradle 6.6.1 和 Kotlin 1.4 - 运行时版本冲突

我使用最新的 Gradle (v. 6.6.1) 和最新的 Kotlin (v. 1.4)。

buildSrc项目定义了所有 Kotlin 版本。不幸的是,它收到以下错误。

The `kotlin-dsl` plugin applied to project ':buildSrc' enables experimental Kotlin compiler features. For more information see https://docs.gradle.org/6.6.1/userguide/kotlin_dsl.html#sec:kotlin-dsl_plugin
w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
    /xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-stdlib-1.3.72.jar (version 1.3)
    /xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-stdlib-common-1.3.72.jar (version 1.3)
    /xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-stdlib-jdk7-1.3.72.jar (version 1.3)
    /xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-stdlib-jdk8-1.3.72.jar (version 1.3)
    /xxx/.gradle/wrapper/dists/gradle-6.6.1-all/43pddabvuyfjfvs8uyekonb98/gradle-6.6.1/lib/kotlin-reflect-1.3.72.jar (version 1.3)
    /xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.4.0/aa2101a19d8688e368ae6e35e8967550ced73884/kotlin-reflect-1.4.0.jar (version 1.4)
    /xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.3.72/916d54b9eb6442b615e6f1488978f551c0674720/kotlin-stdlib-jdk8-1.3.72.jar (version 1.3)
    /xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.3.72/3adfc2f4ea4243e01204be8081fe63bde6b12815/kotlin-stdlib-jdk7-1.3.72.jar (version 1.3)
    /xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.4.0/63e75298e93d4ae0b299bb869cf0c627196f8843/kotlin-stdlib-1.4.0.jar (version 1.4)
    /xxx/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.4.0/1c752cce0ead8d504ccc88a4fed6471fd83ab0dd/kotlin-stdlib-common-1.4.0.jar (version 1.4)
Run Code Online (Sandbox Code Playgroud)

buildSrc项目有以下 …

gradle kotlin gradle-kotlin-dsl kotlin-script

13
推荐指数
1
解决办法
922
查看次数

kscript:如何获取当前文件的目录?

有没有办法获取 kotlin 脚本中当前脚本位置的目录?

我可以在 bash 中实现这一点

 dirname $0
Run Code Online (Sandbox Code Playgroud)

或者

# Absolute path to this script. /home/user/bin/foo.sh
SCRIPT=$(readlink -f $0)
# Absolute path this script is in. /home/user/bin
SCRIPTPATH=`dirname $SCRIPT`
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-script

11
推荐指数
1
解决办法
1041
查看次数

如何配置 kotlin 脚本项目依赖于当前模块?

我想要:

  • .kts里面有文件的目录
  • 带有类的经典src/main/kotlin/my/package模块

并有如下用法:

kotlin my-script.main.kts
Run Code Online (Sandbox Code Playgroud)

my-script.main.kts脚本在示例中看起来像这样

#!/usr/bin/env kotlin

@file:Repository("https://jcenter.bintray.com")
@file:DependsOn("org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.11")

import kotlinx.html.*; import kotlinx.html.stream.*; import kotlinx.html.attributes.*;
import my.package.*;

val addressee = args.firstOrNull() ?: "World"

print(createHTML().html {
    body {
        h1 { +"Hello, $addressee! from ${my.package.Greater.hello()}" }
    }
})


Run Code Online (Sandbox Code Playgroud)

限制:

  • 没有jar依赖项,首先将jar发布到maven repo,然后运行脚本
  • 简洁的设计,它应该是可扩展的,而不是 hello world 项目

如何配置 kotlin 脚本项目依赖于当前模块?到目前为止,最佳实践是什么?

kotlin kotlin-script

6
推荐指数
0
解决办法
487
查看次数

如何在 .kts(Kotlin 脚本)文件中应用插件?

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

虽然我非常喜欢 Kotlin 脚本的想法,但它似乎很少被使用,StackOverflow 上只有 22 个问题,文档极其稀疏,Google 结果也很少。我可以使用@file:DependsOn实际脚本内部而不是传统的构建文件来引入依赖项:

build.gradle

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0'
}
Run Code Online (Sandbox Code Playgroud)

foo.main.kts

@file:DependsOn("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")
Run Code Online (Sandbox Code Playgroud)

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

build.gradle

apply plugin: 'kotlinx-serialization'
Run Code Online (Sandbox Code Playgroud)

foo.main.kts

???
Run Code Online (Sandbox Code Playgroud)

作为参考,我在下面附上了 MWE。错误消息表示该类不可序列化,但正如在这个问题中Node指出的那样,该消息具有误导性并且缺少实际问题,我不知道如何在文件之外使用: apply pluginbuild.gradle

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0'
}
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 上运行:

@file:DependsOn("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-script

6
推荐指数
1
解决办法
1342
查看次数

如何在 Android 项目中使用 Kotlin 工作表

我想在我的 Android 项目中使用Kotlin 工作表,以便添加如下代码草稿:

草稿.ws.kts

package com.example.app

val a = 1 + 1
a
Run Code Online (Sandbox Code Playgroud)

工作表本身正在工作:

val a: Int
2
Run Code Online (Sandbox Code Playgroud)

但是构建我的 Android 应用程序失败并显示以下输出:

> Task :appicals:compileDebugKotlin FAILED
e: org.jetbrains.kotlin.util.KotlinFrontEndException: Front-end Internal error: Failed to analyze declaration Draft_ws
File being compiled: (1,43) in /Users/me/secretproject/app/src/main/java/com/example/app/draft.ws.kts
The root cause org.jetbrains.kotlin.resolve.lazy.NoDescriptorForDeclarationException was thrown at: org.jetbrains.kotlin.resolve.lazy.BasicAbsentDescriptorHandler.diagnoseDescriptorNotFound(AbsentDescriptorHandler.kt:18)
    at org.jetbrains.kotlin.resolve.ExceptionWrappingKtVisitorVoid.visitDeclaration(ExceptionWrappingKtVisitorVoid.kt:43)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:453)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitScript(KtVisitor.java:78)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitScript(KtVisitorVoid.java:73)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitScript(KtVisitorVoid.java:519)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitScript(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtScript.accept(KtScript.java:69)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:59)
    at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer$analyzeDeclarations$1.registerDeclarations(LazyTopDownAnalyzer.kt:78)
    at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer$analyzeDeclarations$1.visitKtFile(LazyTopDownAnalyzer.kt:96)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:513)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtFile.accept(KtFile.kt:242) …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-script

5
推荐指数
1
解决办法
772
查看次数

如何在 kotlin 脚本中包含 jar 文件

我想从我的 kotlin 脚本文件中分离出一些通用代码,以便可以重用它。

我这样做了:

// MyLib.kt

package myLib
fun say_hello(name : String)
{
   println("hello $name")
}
Run Code Online (Sandbox Code Playgroud)

我编译这个文件来创建一个 jar 文件:

kotlinc myLib.kt -include-runtime -d myLib.jar
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个脚本文件:

// myScript.kts

import myLib.*
say_hello("Arvind")
Run Code Online (Sandbox Code Playgroud)

但我无法编译脚本文件,因为它既不识别 myLib 包也不识别 say_hello() 函数。

执行此操作的正确方法是什么。

问题更新: 我正在使用 kscript 来运行我的脚本。打字很多,例如,

kotlin -cp myLib.jar myScript.kts
Run Code Online (Sandbox Code Playgroud)

每次我都必须运行脚本,从而破坏了使用 kscript 的动机。

有没有什么方法可以让我不必每次命令行都给出 jar 的路径。相反,我想以 kscript 的方式使用它,即

./myScript
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-script

5
推荐指数
1
解决办法
2270
查看次数

如何在 GitHub Actions 上运行 Kotlin 脚本?

我想在不依赖 Gradle 项目的情况下在 CI 中运行 Kotlin 脚本,这样我就可以轻松地执行使用 shell/bash/batch 难以编程的操作,并且在需要时可以使用库。

让 Kotlin 脚本仅在 Ubuntu/Linux 上运行很好,但理想情况下,有一种方法可以让它在 Windows 和 macOS 目标以及特定于平台的项目上运行。

kotlin github-actions kotlin-script

5
推荐指数
2
解决办法
247
查看次数

Kotlin 脚本 (.kts) 文件——没有 println?

我正在尝试使用 Kotlin 作为脚本语言。根据他们的文档,您应该能够在 Kotlin 脚本中运行顶级代码。

我使用他们的官方示例编写的一个简单的“Hello,World”程序不输出任何文本。它编译/解释,成功终止,但 println() 语句似乎没有执行任何操作

fun main(args: Array<String>) {
    println("Hello, World!")
}
Run Code Online (Sandbox Code Playgroud)

有谁知道在哪里可以找到使用 Kotlin 作为脚本语言时实际支持的内容的表格/摘要?我在让它做一个简单的打印语句时缺少什么。

我正在 Ubuntu 上使用通过 sdkman 安装的 Kotlin SDK 运行。从 Ubuntu 提供的普通终端运行。预期的输出将是一行“Hello, World!” 显示,但根本没有输出。

kotlin kotlin-script

4
推荐指数
1
解决办法
1335
查看次数

什么是 java.constructors.single()?

我正在学习 Kotlin 如何评估脚本,我在BasicJvmScriptEvaluator 中看到了如下代码:

    val ctor = java.constructors.single()

    val saveClassLoader = Thread.currentThread().contextClassLoader
    Thread.currentThread().contextClassLoader = this.java.classLoader
    return try {
        ctor.newInstance(*args.toArray())
    } finally {
        Thread.currentThread().contextClassLoader = saveClassLoader
    }
Run Code Online (Sandbox Code Playgroud)

我不明白代码java.constructors.single(),没有名为 java.constructors 的包。我应该如何理解这段代码?

java kotlin kotlin-script

2
推荐指数
1
解决办法
82
查看次数

Kotlin 脚本找不到 Ktor CIO 类

我正在尝试将kotlin-main-kts与 Ktor 客户端一起使用。

这是我的简单 Kotlin 脚本,位于名为 的文件中ktor_tests.main.kts

@file:Repository("https://repo1.maven.org/maven2")
@file:DependsOn("io.ktor:ktor-client-core-jvm:1.5.3")
@file:DependsOn("io.ktor:ktor-client-cio:1.5.3")

import io.ktor.client.HttpClient
import io.ktor.client.engine.cio.CIO

println("Hello")

HttpClient(CIO).use {
    println("In client scope.")
}
Run Code Online (Sandbox Code Playgroud)

我运行它

kotlinc -cp ~/.m2/repository/org/jetbrains/kotlin/kotlin-main-kts/1.4.21/kotlin-main-kts-1.4.21.jar -script ktor_tests.main.kts
Run Code Online (Sandbox Code Playgroud)

输出是

OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.intellij.util.ReflectionUtil …
Run Code Online (Sandbox Code Playgroud)

kotlin ktor kotlin-script

2
推荐指数
1
解决办法
761
查看次数