Gradle Kotlin DSL:如何访问settings.gradle.kts中定义的对象?
在Gradle 5.2 Kotlin DSL中从settings.gradle.kts获取定义的对象
在Groovy DSL里用gradle.ext的方式,在Kotlin DSL中确实有不同的实现逻辑,不过有两种可靠的方案可以解决这个问题:
方案1:将对象放入rootProject的extra(推荐)
这种方式和Groovy里的gradle.ext行为最接近,而且所有子项目都能方便地访问这些值。
在settings.gradle.kts中定义:
// 定义简单属性 rootProject.extra.apply { set("appVersion", "1.0.0") set("apiBaseUrl", "https://api.example.com") } // 定义自定义数据类对象 data class AppBuildConfig( val buildNumber: Int, val isDebug: Boolean ) rootProject.extra["buildConfig"] = AppBuildConfig(42, false)
在build.gradle.kts中获取:
你可以用Kotlin的委托属性来实现类型安全的获取,避免手动强制转换:
// 获取简单属性 val appVersion: String by project.extra val apiBaseUrl: String by project.extra // 获取自定义对象 val buildConfig: AppBuildConfig by project.extra // 直接使用这些值 println("当前应用版本:$appVersion") println("API地址:$apiBaseUrl") println("构建编号:${buildConfig.buildNumber}")
如果不需要委托,也可以直接通过get方法获取(需要手动强转):
val appVersion = project.extra["appVersion"] as String
方案2:直接使用Settings的extra属性
如果你只想在settings里定义,然后通过gradle对象访问,也可以直接给Settings的extra赋值,然后在build脚本中通过gradle.settings.extra获取:
在settings.gradle.kts中定义:
// 给Settings的extra赋值 extra["settingsSpecificValue"] = "仅在settings中定义的内容" // 自定义对象同样适用 data class EnvConfig(val env: String) extra["envConfig"] = EnvConfig("production")
在build.gradle.kts中获取:
// 类型安全的获取 val settingsSpecificValue: String by gradle.settings.extra val envConfig: EnvConfig by gradle.settings.extra // 使用示例 println("Settings中的值:$settingsSpecificValue") println("当前环境:${envConfig.env}")
注意事项
- Gradle 5.2的Kotlin DSL已经支持
extra扩展属性,但需要注意区分Settings的extra和Project的extra,前者属于settings层面,后者属于项目层面。 - 推荐用方案1,因为它的访问方式更统一,子项目无需额外处理就能获取rootProject里的extra值。
内容的提问来源于stack exchange,提问作者alex137
相关产品推荐
相关产品推荐

