使用依赖项评估 kotlin 脚本文件
Evaluate kotlin script file with dependencies
问题:如何在运行时执行一组 kotlin 文件以及 return 一个 kts
文件的结果?
我是写系统的,可以用指令执行kts
文件。目前它支持以下执行模式:
main.kts
- 该文件将被执行。应该returnList<Step>
但是用户可以将任何其他文件放在同一文件夹中。例如,文件夹可以有以下文件:
main.kts
Constants.kt
// 它有一些常量
Helpers.kt
// 一些额外的方法
ScriptEngine 有评估代码的方法,但是它只有一个输入文件。
问题:如何让ScriptEngine将类编译到类路径中,却只执行其中一个?
此解决方案不正确,因为文件顺序很重要(例如,如果第一个文件依赖于最后一个文件,编译将失败):
// there is security issue here
val classLoader = Thread.currentThread().contextClassLoader
val engineManager = ScriptEngineManager(classLoader)
setIdeaIoUseFallback()
val ktsEngine: ScriptEngine = engineManager.getEngineByExtension("kts")
/**
* There is issue here: if file1 requires file2 compilation then execution below fails.
*
* Right way: find the solution to compile whole folder and evaluate the single file.
*/
filesFromFolderExceptMain.forEach {
ktsEngine.eval(it)
}
return ktsEngine.eval(mainScriptFile) as List<Step>
另一种解决方案(会导致不可预知的编译波动):
val context = filesFromFolderExceptMain.joinToString(System.lineSeparator()
ktsEngine.eval(context)
return ktsEngine.eval(mainScriptFile) as List<Step>
那么,问题:如何在运行时执行一组 kotlin 文件以及其中一个 kts
文件的 return 结果?
您应该做的是将 @file:Import("Constants.kt", "Helpers.kt")
添加到主脚本(参见 https://github.com/Kotlin/KEEP/blob/master/proposals/scripting-support.md#kotlin-main-kts)。虽然我不确定它是相对于脚本所在的目录还是相对于工作目录。
如果您不希望用户必须这样做,您可以将它们传递给 importedScripts
。
问题:如何在运行时执行一组 kotlin 文件以及 return 一个 kts
文件的结果?
我是写系统的,可以用指令执行kts
文件。目前它支持以下执行模式:
main.kts
- 该文件将被执行。应该returnList<Step>
但是用户可以将任何其他文件放在同一文件夹中。例如,文件夹可以有以下文件:
main.kts
Constants.kt
// 它有一些常量Helpers.kt
// 一些额外的方法
ScriptEngine 有评估代码的方法,但是它只有一个输入文件。
问题:如何让ScriptEngine将类编译到类路径中,却只执行其中一个?
此解决方案不正确,因为文件顺序很重要(例如,如果第一个文件依赖于最后一个文件,编译将失败):
// there is security issue here
val classLoader = Thread.currentThread().contextClassLoader
val engineManager = ScriptEngineManager(classLoader)
setIdeaIoUseFallback()
val ktsEngine: ScriptEngine = engineManager.getEngineByExtension("kts")
/**
* There is issue here: if file1 requires file2 compilation then execution below fails.
*
* Right way: find the solution to compile whole folder and evaluate the single file.
*/
filesFromFolderExceptMain.forEach {
ktsEngine.eval(it)
}
return ktsEngine.eval(mainScriptFile) as List<Step>
另一种解决方案(会导致不可预知的编译波动):
val context = filesFromFolderExceptMain.joinToString(System.lineSeparator()
ktsEngine.eval(context)
return ktsEngine.eval(mainScriptFile) as List<Step>
那么,问题:如何在运行时执行一组 kotlin 文件以及其中一个 kts
文件的 return 结果?
您应该做的是将 @file:Import("Constants.kt", "Helpers.kt")
添加到主脚本(参见 https://github.com/Kotlin/KEEP/blob/master/proposals/scripting-support.md#kotlin-main-kts)。虽然我不确定它是相对于脚本所在的目录还是相对于工作目录。
如果您不希望用户必须这样做,您可以将它们传递给 importedScripts
。