gradle 允许重写buildConfigField以进行本地调试,但阻止提交

2ledvvac  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(177)

我的Android应用程序与app/build.gradle中的buildConfigField中定义的服务器通信:

buildConfigField "android.net.Uri", "server", 'android.net.Uri.parse("https://app.example.com")'

(We请使用buildConfigField,因为这样可以让不同“风格”的应用程序指向不同的服务器。)
有时,开发人员需要更改此值,以指向在不同服务器上运行的服务器软件的本地副本。
我遇到的问题是,这些开发者经常忘记他们已经做了这些更改,然后盲目地将他们所有的更改提交到git仓库,从而破坏了其他人的应用,直到其他人将其更改回原始值。
是否有一种方法可以让开发人员从一个单独的(.gitingore d)文件中覆盖buildConfigField,这样他们就无法提交他们的更改?

z4bn682m

z4bn682m1#

受@TTT的一条评论启发,我现在是如何从.env文件(或环境变量)生成BuildConfig字段的。为了防止共享不需要的变量(例如其他可能包含敏感数据的系统变量),它只处理名称以ANDROID_开始的变量。
这需要在项目中设置co.uzzu.dotenv.gradle Gradle插件。

androidComponents {
    onVariants(selector().all(), { variant ->
        env.allVariables.each {
            if (it.key.startsWith("ANDROID_")) {
                def key = it.key.substring(8)
                    .split("_")
                    .collect {
                        it.substring(0,1).toUpperCase(Locale.ROOT) +
                        it.substring(1).toLowerCase(Locale.ROOT)
                    }
                    .join("")
                key = key.substring(0,1).toLowerCase(Locale.ROOT)+key.substring(1)

                def type = "String"
                def wrapper = '"%s"'
                def value = it.value
                if (value.isEmpty()) {
                    wrapper = '%s'
                    value = null
                } else if (value.matches("-?\\d+")) {
                    type = "int"
                    wrapper = '%s'
                } else if (value.matches("-?\\d+(.\\d+)")) {
                    type = "double"
                    wrapper = '%s'
                } else if (value.matches("https?://.*")) {
                    type = "android.net.Uri"
                    wrapper = 'android.net.Uri.parse("%s")'
                }
                variant.buildConfigFields.put(key, new BuildConfigField(type, String.format(wrapper, value), "Field from .env"))
            }
        }
    })
}

它支持booleanintdoubleStringandroid.net.Uri等变量(但只有String可以是null,因为它无法在没有值的情况下确定类型)。

相关问题