如何禁用多平台依赖项的原生编译以优化CI构建?
解决Ktor JVM项目构建时Kotlin/Native编译器自动下载的问题
你的场景是:基于JVM的Ktor后端项目依赖了一个多平台项目,依赖配置如下:
dependencies { implementation(project(":api")) }
在CI环境构建时,Gradle会自动下载并安装Kotlin/Native编译器,还提示iOS相关原生目标无法构建,浪费了不必要的构建时间。可以通过以下几种方式解决:
方法1:仅构建依赖项目的JVM目标
因为你的主项目是JVM环境,完全不需要构建:api模块的Native目标,直接在CI构建命令中指定只处理JVM相关任务即可。
如果原来的构建命令是./gradlew build,修改为:
./gradlew :api:jvmBuild build
或者通过排除Native目标的任务来避免:
./gradlew build -x :api:iosArm64MainClasses -x :api:iosSimulatorArm64MainClasses -x :api:iosX64MainClasses
方法2:通过Gradle属性禁用Native相关处理
在项目根目录的gradle.properties文件中添加以下配置:
# 隐藏禁用Native目标的警告 kotlin.native.ignoreDisabledTargets=true # 禁止自动下载Kotlin/Native编译器 kotlin.native.disableCompilerDownload=true
这样既不会弹出目标禁用的警告,也不会触发Konan编译器的下载和安装流程。
方法3:修改多平台项目的目标配置(若有权限修改:api模块)
如果可以编辑:api模块的构建脚本(build.gradle.kts或build.gradle),可以动态控制目标的添加,比如只在本地开发环境保留Native目标,CI环境仅保留JVM目标:
Kotlin DSL(build.gradle.kts)示例:
kotlin { jvm { // 保持原有的JVM目标配置 } // 仅在非CI环境添加iOS等Native目标 if (System.getenv("CI") == null) { iosArm64() iosSimulatorArm64() iosX64() } }
Groovy DSL(build.gradle)示例:
kotlin { jvm { // 保持原有的JVM目标配置 } // 仅在非CI环境添加iOS等Native目标 if (System.getenv("CI") == null) { iosArm64() iosSimulatorArm64() iosX64() } }
内容的提问来源于stack exchange,提问作者Georg Prohaska
相关产品推荐
相关产品推荐

