Kotlin 编译器服务器
一个用于编译和执行 Kotlin 代码的 REST 服务器。 该服务器为 Kotlin Playground 库提供 API。
如何开始 :checkered_flag:
简单的 Spring Boot 应用程序
在启动服务器之前,下载 Kotlin 依赖项并构建执行器:
$ ./gradlew build -x test
启动 Spring Boot 项目。主类:com.compiler.server.CompilerApplication
使用 Docker
要在 Docker 容器内构建应用程序,请从项目目录运行以下命令:
$ ./docker-image-build.sh
从 Amazon Lambda
$ ./gradlew buildLambda
从 build/distributions
获取 .zip
文件。
Lambda 处理程序:com.compiler.server.lambdas.StreamLambdaHandler::handleRequest
。
发布您的 Lambda 函数:您可以按照 AWS Lambda 文档 中的说明打包您的函数以进行部署。
从 Kotless
添加 Kotless 并 移除 aws-serverless-container =)
API 文档 :page_with_curl:
在 JVM 上执行 Kotlin 代码
curl -X POST \
http://localhost:8080/api/compiler/run \
-H 'Content-Type: application/json' \
-d '{
"args": "1 2 3",
"files": [
{
"name": "File.kt",
"text": "fun main() {\n println(\"123\")\n}"
}
]
}'
将 Kotlin 代码转换为 JavaScript 代码
curl -X POST \
http://localhost:8080/api/compiler/translate \
-H 'Content-Type: application/json' \
-d '{
"args": "1 2 3",
"files": [
{
"name": "File.kt",
"text": "fun main(args: Array<String>) {\n println(args[0])\n }"
}
]
}'
运行 Kotlin 测试
curl -X POST \
http://localhost:8080/api/compiler/test \
-H 'Content-Type: application/json' \
-d '{
"files": [
{
"name": "File.kt",
"text": "fun start(): String = \"OK\""
},
{
"name": "test0.kt",
"text": "import org.junit.Assert\nimport org.junit.Test\n\nclass TestStart {\n @Test fun testOk() {\n Assert.assertEquals(\"OK\", start())\n }\n}"
},
{
"name": "test1.kt",
"text": "package koans.util\n\nfun String.toMessage() = \"The function '\''$this'\'' is implemented incorrectly\"\n\nfun String.toMessageInEquals() = toMessage().inEquals()\n\nfun String.inEquals() = this"
}
]
}'
获取代码中指定位置的代码补全
curl -X POST \
'http://localhost:8080/api/compiler/complete?line=2&ch=15' \
-H 'Content-Type: application/json' \
-d '{
"files": [
{
"name": "File.kt",
"text": "fun main() {\n val sinusoid = \"sinusoid\"\n val s = sin\n}"
}
]
}'
获取代码分析结果
curl -X POST \
http://localhost:8080/api/compiler/highlight \
-H 'Content-Type: application/json' \
-d '{
"files": [
{
"name": "File.kt",
"text": "fun main() {\n println(\"Hello, world!!!\")ass\n val random = Random\n}"
}
]
}'
获取当前 Kotlin 版本
curl -X GET http://localhost:8080/versions
该服务器还支持 Kotlin Playground 库的 API。
如何向 Kotlin 编译器添加依赖项 :books:
只需通过名为 kotlinDependency
的任务将您需要的依赖项添加到 build.gradle.kts 中:
kotlinDependency "your dependency"
注意:如果您添加的库使用反射、访问文件系统或执行任何其他类型的安全敏感操作,请不要忘记配置 executors.policy。点击此处 获取有关 Java 安全策略 的更多信息。
如何在 executors.policy
中设置 Java 安全策略
如果您想配置自定义依赖项,请使用标记 @LIB_DIR@
:
grant codeBase "file:%%LIB_DIR%%/junit-4.12.jar"{
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.lang.RuntimePermission "setIO";
permission java.io.FilePermission "<<ALL FILES>>", "read";
permission java.lang.RuntimePermission "accessDeclaredMembers";
};
CORS 配置
设置环境变量
环境变量 | 默认值 |
---|---|
ACCESS_CONTROL_ALLOW_ORIGIN_VALUE | * |
ACCESS_CONTROL_ALLOW_HEADER_VALUE | * |
配置日志记录
我们使用 prod
spring 活动配置文件以 JSON 格式流式传输日志。
您可以通过提供 -Dspring.profiles.active=prod
或将环境变量 SPRING_PROFILES_ACTIVE
设置为 prod
值来设置 spring 配置文件。
执行失败日志
在执行失败的情况下,标准输出中将出现 INFO 级别的事件:
{
"date_time": "31/Aug/2021:11:49:45 +03:00",
"@version": "1",
"message": "Code execution is complete.",
"logger_name": "com.compiler.server.service.KotlinProjectExecutor",
"thread_name": "http-nio-8080-exec-1",
"level": "INFO",
"level_value": 20000,
"hasErrors": true,
"confType": "JAVA",
"kotlinVersion": "$koltinVersion"
}
Kotlin 发布指南 :rocket:
- 在 gradle.properties 中更新 kotlin 版本
- 通过以下任务确保一切正常:
$ ./gradlew build
- 使用 kotlin 版本的名称保存分支。模式:
/^[0-9.]+$/
(可选) - 在 GitHub releases 上更新版本(可选)