如何在 BuildSrc 中创建 FlavorConfig?
Posted
技术标签:
【中文标题】如何在 BuildSrc 中创建 FlavorConfig?【英文标题】:How to create a FlavorConfig in BuildSrc? 【发布时间】:2020-03-15 05:54:26 【问题描述】:我正在尝试创建一个 Flavor 配置以避免每个模块和库 gradle 文件中的样板代码。
为此,我正在尝试转换 Piotr Zawadzki 解决方案 (https://medium.com/stepstone-tech/modularizing-your-flavored-android-project-5db75c59fb0d),该解决方案使用 groovy with() 方法与包含风味配置的闭包相结合。
ext.flavorConfig = // 1
flavorDimensions "pricing"
productFlavors
free
dimension "pricing"
ext.myApplicationIdSuffix = '.free' // 2
paid
dimension "pricing"
ext.myApplicationIdSuffix = '.paid'
productFlavors.all flavor -> // 3
if (flavor.hasProperty('myApplicationIdSuffix') && isApplicationProject())
flavor.applicationIdSuffix = flavor.myApplicationIdSuffix
def isApplicationProject() // 4
return project.android.class.simpleName.startsWith('BaseAppModuleExtension')
// in AGP 3.1.x with library modules instead of feature modules:
// return project.android instanceof com.android.build.gradle.AppExtension
我没有找到与 Kotlin DSL 等效的 with() 方法或翻译闭包的正确方法。
【问题讨论】:
【参考方案1】:等价的应该是apply
或run
,这取决于with
的实际返回值(由于某种原因我无法弄清楚)。
【讨论】:
【参考方案2】:我用 KotlinScript 找到了一个解决方案,我认为它也可以用 Groovy 完成。
首先,在你的 buildSrc/build.gradle.kts 文件中添加 gradle-api 依赖
//buildSrc/build.gradle.kts
val agpVersion = "7.1.1"
plugins
`kotlin-dsl`
repositories
mavenCentral()
google()
dependencies
implementation("com.android.tools.build:gradle-api:$agpVersion")
然后在 buildSrc 中创建一个 Gradle 插件。
//buildSrc/src/main/kotlin/FooPlugin.kt
abstract class FooPlugin : Plugin<Project>
override fun apply(project: Project)
val android = project.extensions.getByType(ApplicationExtension::class.java)
android.defaultConfig
android.productFlavors.create("Bar")
最后将 FooPlugin 应用到应用程序的 build.gradle.kts
//baz/build.gradle.kts
plugins
...
apply<FooPlugin>()
android
...
dependencies
...
【讨论】:
以上是关于如何在 BuildSrc 中创建 FlavorConfig?的主要内容,如果未能解决你的问题,请参考以下文章
如何像在 babelrc 中创建依赖别名一样在 typescript 中创建类型别名?