Gradle Kotlin DSL:如何跨多仓库共享工具函数
可行的复用方案
方案1:打包成二进制Gradle插件(首推)
脚本插件容易踩类路径的坑,二进制插件是多仓库复用工具代码最稳定的方式,完全适配你50+仓库的场景。
步骤1:搭建插件项目
新建一个独立的Gradle项目,配置build.gradle.kts:
plugins { `java-gradle-plugin` kotlin("jvm") version "1.9.0" `maven-publish` } group = "com.yourcompany.gradle" version = "1.0.0" gradlePlugin { plugins { create("systemPropertiesHelper") { id = "com.yourcompany.gradle.system-properties-helper" implementationClass = "com.yourcompany.gradle.SystemPropertiesHelperPlugin" } } } repositories { mavenCentral() } dependencies { implementation(kotlin("stdlib-jdk8")) }
步骤2:编写插件逻辑与扩展函数
在src/main/kotlin/com/yourcompany/gradle/下创建两个文件:
// SystemPropertiesHelperPlugin.kt import org.gradle.api.Plugin import org.gradle.api.Project class SystemPropertiesHelperPlugin : Plugin<Project> { override fun apply(project: Project) { // 插件空实现即可,核心是把扩展函数带入类路径 } }
// SystemPropertiesExtensions.kt import java.util.Properties // 顶层扩展函数,引入插件后全局可用 fun Properties.toStringMap(): Map<String, String> = this.toMap().map { it.key.toString() to it.value.toString() }.toMap()
步骤3:发布插件
将插件推送到内部Maven仓库,或先本地测试:
./gradlew publishToMavenLocal
步骤4:业务项目中使用
先在settings.gradle.kts添加仓库地址:
pluginManagement { repositories { mavenLocal() // 本地测试用 maven { url = uri("https://你的内部仓库地址") } gradlePluginPortal() } }
然后在build.gradle.kts引入插件:
plugins { id("com.yourcompany.gradle.system-properties-helper") version "1.0.0" } // 直接复用你的原代码 tasks.withType<JavaExec> { systemProperties = System.getProperties().toStringMap() }
方案2:使用共享buildSrc(小范围快速复用)
如果不想搞独立插件,用buildSrc共享代码也能快速实现复用,适合内部团队小范围场景。
步骤1:创建共享buildSrc项目
单独搭建一个buildSrc项目,目录结构如下:
buildSrc/ ├── build.gradle.kts └── src/main/kotlin/ └── SystemPropertiesExtensions.kt
build.gradle.kts配置:
plugins { kotlin("jvm") version "1.9.0" } repositories { mavenCentral() }
SystemPropertiesExtensions.kt直接放入你的扩展函数:
import java.util.Properties fun Properties.toStringMap(): Map<String, String> = this.toMap().map { it.key.toString() to it.value.toString() }.toMap()
步骤2:业务项目引入
在业务项目的settings.gradle.kts中添加:
includeBuild("../path/to/你的共享buildSrc")
之后业务项目的构建脚本就能直接调用toStringMap(),无需额外配置。
方案3:修复脚本插件问题
你之前尝试脚本插件失败,大概率是类路径处理不当,试试以下写法:
步骤1:编写脚本插件文件system-properties-helper.gradle.kts
import java.util.Properties // 直接定义扩展函数,脚本应用后全局可见 fun Properties.toStringMap(): Map<String, String> = this.toMap().map { it.key.toString() to it.value.toString() }.toMap() // 可选:自动给所有JavaExec任务配置,省去每个项目重复写代码 tasks.withType<JavaExec> { systemProperties = System.getProperties().toStringMap() }
步骤2:共享脚本
将该脚本上传到内部Git仓库或HTTP服务器,业务项目直接引用:
apply(from = "https://你的内部服务器地址/scripts/system-properties-helper.gradle.kts")
这种方式比二进制插件灵活,但稳定性稍差(比如脚本地址变更会导致失败),适合临时复用场景。
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

