在build.gradle.kts与应用程序之间共享变量的可行性咨询
当然可以啦!很多开发者都会遇到这种想统一管理配置的需求,毕竟重复写多了不仅麻烦,还容易出错。下面给你几种实用的方法,你可以根据自己的项目类型来选:
方法一:生成配置文件让应用直接读取
这是最通用也最推荐的方式——在build.gradle.kts里定义好变量,然后让Gradle自动生成一个应用能读取的配置文件,不管是打包后的应用还是开发调试都能稳定拿到值。
举个Android项目的例子,在build.gradle.kts的android块里配置:
android { defaultConfig { // 先定义我们要共享的变量 val appName = "我的酷应用" val appVersion = "2.1.0" // 方式1:生成BuildConfig类,直接在代码里引用 buildConfigField("String", "APP_NAME", "\"$appName\"") buildConfigField("String", "APP_VERSION", "\"$appVersion\"") // 方式2:生成字符串资源,适合Android的UI展示 resValue("string", "app_name_from_gradle", appName) } }
之后在Android代码里就能直接用:
// 从BuildConfig取 val appName = BuildConfig.APP_NAME // 从资源文件取 val appVersion = getString(R.string.app_name_from_gradle)
如果是Java SE项目,你可以用processResources任务来替换模板文件。比如先准备一个src/main/resources/app-config.properties.template,内容是:
app.name=${appName} app.version=${appVersion}
然后在build.gradle.kts里配置:
val appName = "我的Java应用" val appVersion = "1.0.3" tasks.processResources { filesMatching("app-config.properties.template") { expand(mapOf( "appName" to appName, "appVersion" to appVersion )) rename("app-config.properties.template", "app-config.properties") } }
这样构建时会自动生成app-config.properties,应用里直接读取这个文件就行。
方法二:运行时通过JVM系统属性传递
如果只是在开发调试阶段需要传递变量,或者应用是通过Gradle的run任务启动的,那可以直接设置JVM系统属性:
在build.gradle.kts里配置JavaExec任务:
tasks.withType<JavaExec> { val appEnv = "debug" systemProperty("app.env", appEnv) }
然后在应用代码里读取:
// Java代码 String env = System.getProperty("app.env");
// Kotlin代码 val env = System.getProperty("app.env")
不过要注意,这种方式只在通过Gradle启动应用时有效,打包成JAR后直接运行的话,这些属性就没了,所以适合临时调试用。
方法三:用统一的Gradle配置脚本管理变量
如果变量比较多,想单独抽离出来管理,你可以建一个专门的配置脚本,比如config.gradle.kts:
// config.gradle.kts val appConfig = mapOf( "appName" to "统一配置应用", "appVersion" to "3.0.0", "apiBaseUrl" to "https://api.example.com" ) extra["appConfig"] = appConfig
然后在build.gradle.kts开头引入这个脚本:
apply(from = "config.gradle.kts") val appConfig = extra["appConfig"] as Map<String, String> val appName = appConfig["appName"]!! val appVersion = appConfig["appVersion"]!!
之后再结合方法一,把这些变量生成应用能读取的配置文件,这样变量只在config.gradle.kts里写一次,Gradle和应用都能拿到统一的值,维护起来超方便。
总之,统一管理配置完全可行,选对方法能省不少事呢!
备注:内容来源于stack exchange,提问作者t3chb0t

