在IntelliJ IDEA中,创建和执行依赖于项目中代码的Kotlin脚本(.kts)的正确方法是什么?

2izufjch  于 2023-01-29  发布在  IntelliJ IDEA
关注(0)|答案(1)|浏览(315)
    • bounty将在4天后过期**。回答此问题可获得+50的声誉奖励。codeape正在寻找来自声誉良好来源的答案

我有一个简单的IntelliJ IDEA kotlin项目与标准的目录布局,即:

src/
  main/
    kotlin/
      ClassA.kts
      ClassB.kts
    resources/
  test/
    kotlin/
      TestClassA.kts
      TestClassB.kts

在这个项目中,我想使用kotlin脚本(. kts文件),我想使用IntelliJ来编辑和执行这些脚本。
在脚本中我需要使用main中定义的类、函数等,比如ClassA(使用test中的东西也很好)。为了帮助编写脚本,我希望从IntelliJ获得代码完成和其他编码帮助。
问题:

  • 我应该把.kts文件放在哪里?
  • 如何指定脚本在执行脚本时使用项目的类路径?
  • 如何让IntelliJ在脚本文件中提供代码完成?
  • 在我看来,似乎只有kotlin scratch文件和kotlin工作表文件可以正常工作(参见https://kotlinlang.org/docs/run-code-snippets.html)。
  • 我想要的是与项目中的其他源代码一起存储的适当脚本,以及从IntelliJ运行配置或从终端运行它们的方法。

我使用的是IntelliJ IDEA 2022.3.1/kotlin插件223 - 1.7.21-版本-272 -IJ8214.52。
另请参见IntelliJ问题跟踪器:https://youtrack.jetbrains.com/issue/KT-55833/Kotlin-scripting-should-have-more-documentation-and-it-should-be-easier-to-execute-scripts-from-the-command-line

kuhbmx9i

kuhbmx9i1#

.main.kts的要点在于它非常简单,不需要构建系统,因此只能通过依赖关系来依赖使用Maven/Gradle/Bazel构建的项目。
“IntelliJ IDEAKotlinproject”听起来好像您甚至没有一个构建系统,该系统几乎排除了从命令行运行的可能性,即使直接链接是可能的。在接下来的部分中,我将假设Gradle,因为这是我所熟悉的,但等效系统在其他系统中也可以工作。
在深入讨论之前,我想调用XYProblem,因为您可能不需要.kts,一个简单的main.ktfun main()也可以工作,然后在结果应用程序或gradlew :module:run --args "..."上运行java -jar就可以正常工作,不需要任何特殊处理。奇怪的是,就在今天,我读了this article,它详细描述了如何制作一个易于运行的小型Kotlin应用程序。
一种选择是使用@file:Import,但我还没有让它工作,它似乎是others neither
<rabbithole>因此,我对此唯一可行的想法是让您的库将jar发布到本地存储库(Gradle mavenLocal())或从本地构建文件夹导入(flatDir或使用maven { url = file://)。请注意,这些是Gradle API,这意味着Gradle可以通过某种方式发布到这些API。
现在我们在本地文件系统的src/main/kotlin中有一个.jar文件,.main.kts文件可以从Maven资源库导入JAR(示例),如果幸运的话,这个内置的@file:Repository还支持本地file:// URI,所以它“可以正常工作”。
注意:.main.kts文件的位置并不重要,重要的是它们的文件名,这会产生巨大的差异。
开发人员使用此解决方案的经验如下:

  • src/main/kotlin中写入代码
  • src/test/kotlin中写入单元测试
  • 构建
  • 生成后刷新app.main.kts的类路径
  • 代码正常运行,因为代码完成正常工作(导航可能不工作)

</rabbithole>,请注意,以上内容与应用中的main.kt文件非常相似,不同之处在于main.kt完全受支持,您可以执行预编译、缩小、打包等操作。
您可以在此处找到一些.main.kts示例:https://github.com/TWiStErRob/TWiStErRob-env/search?q=filename%3Amain.kts,但它们不使用本地代码,都是仅具有mavenCentral()依赖项的单文件。

相关问题