如何在本地 kotlinc 上运行远程调试

spa*_*neg 4 gradle kotlin kotlinc

我想使用本地编译器编译一些示例 kotlin 项目。我从 Githib 克隆 jetbrains/kotlin 项目并构建它。现在我在 /dist 文件夹中有本地编译器。我需要如何在示例项目中配置 gradle 以在其中使用此本地编译器并具有远程调试的能力?

hot*_*key 5

最简单的方法是构建整个工具链并在您的测试项目中使用它。为此,请install在 Kotlin 项目中运行Gradle 任务:

./gradlew install
Run Code Online (Sandbox Code Playgroud)

这将~/.m2/repository使用当前的默认快照版本将项目的所有 Maven 模块发布到 Maven 本地存储库(默认情况下)1.3-SNAPSHOT

然后,在您的测试 Gradle 项目中:

  • 如果您使用buildscript块和apply语句应用 Gradle 插件,请将mavenLocal()存储库添加到buildscript { repositories { ... } }并使用 Gradle 插件的快照版本:

    buildscript {
        repositories {
            mavenLocal()
            jcenter()
        }
        dependencies {
            classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3-SNAPSHOT")
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果使用plugins { ... }块应用插件,请修改settings.gradle脚本并添加以下内容:

    pluginManagement {
        repositories {
            mavenLocal()
            gradlePluginPortal()
        }   
    }
    
    Run Code Online (Sandbox Code Playgroud)

    再次,使用1.3-SNAPSHOTGradle 插件的版本:

    plugins {
        id("org.jetbrains.kotlin.jvm").version("1.3-SNAPSHOT")
    }
    
    Run Code Online (Sandbox Code Playgroud)

为了能够调试编译器,您需要使用等待连接的调试代理运行其进程。通常,编译器在一个难以连接的守护进程中运行。在 Gradle 进程中运行编译器要简单得多。要做到这一点,你需要一个系统属性设置kotlin.compiler.execution.strategyin-process在摇篮过程(注意:这应该不是一个摇篮项目属性,但可通过传递Java系统属性-Dkey=value或使用集System.setProperty(...)

然后使用命令行运行 Gradle 构建,-Dorg.gradle.debug=true让 Gradle 等待远程调试器。我建议从终端运行测试项目构建,而不是 IDE。

这将如下所示:

./gradlew compileKotlin -Dorg.gradle.debug=true -Dkotlin.compiler.execution.strategy=in-process

Starting a Gradle Daemon, 1 busy Daemon could not be reused, use --status for details

> Starting Daemon
Run Code Online (Sandbox Code Playgroud)

(此时,构建似乎挂起,但它只是在等待调试器,因此请继续下面的操作)

在您使用 Kotlin 项目的 IDE 中,在编译器代码中放置一些断点并将远程调试器附加到 Gradle 进程。

请注意,由于 Kotlin 编译器在 Gradle 进程中运行,后者可能会更快地耗尽内存。确保 Gradle 进程获得足够的堆空间。