参数传递
Gradle 的构建环境中有着各种各样的 Options / Arguments / Properties / Variables,这节我们讨论下几种参数之间的区别、覆盖关系、使用姿势等等。
CLI Options
最直接的参数传递入口、同时也是官方介绍地最全面的参数集便是命令行的参数,可以按照下方的五个维度参阅官方的 CLI Options 相关介绍。
- Debugging options
- Performance options
- Logging options
- Execution options
- Environment options
快速浏览一遍有个印象后,可结合几个案例加深理解:
- "Troubleshooting builds"@Stefan M.
- "How to debug Gradle Plugins with IntelliJ"@StefanM.
- "构建指北 #9 Gradle 脚本调试"@2BAB
这三篇文章主要是调试、性能监控服务相关的文章,注意 Plugin 的调试和 Scripts 的调试虽然步骤一致,但是 Scripts 的调试能力现在还不完善(详见第三个链接)。其他像 --dry-run --refresh-dependencies -Dorg.gradle.jvmargs 也是常用配合调试的利器。
gradle.properties
部分和性能相关的开关,除了 CLI 的写法,也有对应 gradle.properties 的 key。gradle.properties 是 Gradle 默认放置一些环境参数的文件,一些常用的参数可以固化在这个文件内从而避免每次都在 CLI 编写大量的参数。它的定义以及和 CLI 参数的覆盖关系如下文档:
gradle.properties 包含了各类 System properties, Env variables, Project properties,还有各种插件的 properties,可以对照上述的文档和 CLI 的参数进行整理。额外对于 AGP 和 Kotlin 的 Properties,可以参考如下的文章:
- "Configuring Gradle with gradle.properties"@Jean-Michel Fayard
- "How to Store Credentials in Android Projects Using gradle.properties"@Clint Paul
- "Dependencies versions in Gradle Kotlin DSL"@Kamil Seweryn: 共享依赖的变种;
读取和使用
其实在上个部分的最后一篇文章中,我们已经看到了如何使用 gradle.properties 进行依赖版本的管理。这里我们列出一些更通用的自定义的参数输入和读取,重点理解通过 extra 和 by project 代理的两种读取方式。:
- "Declaring variables"@Gradle
- "ext-in-buildscript-can-not-be-recognised-by-gradle-kotlin-dsl":Gradle Groovy DSL 中我们熟悉的
ext去哪里了?Gradle Kotlin DSL 中的extra又是什么? - "ExtraPropertiesExtension"@Gradle
- "Set gradle.ext in settings.gradle.kts with Gradle Kotlin DSL"@Tura:Kotlin 的插件中如何访问
extra字段 - "Reference property in Gradle Properties"@Zsolt Boldizsár
- "kotlin-dsl-samples/samples/extra-properties"@Gradle
- "kotlin-dsl-samples/samples/project-properties/"@Gradle
另外,buildscript{} 配合 ext 或者 extra 时还有一个常见问题:
小结
- Gradle 自带的一些参数多数还是和监控、调试相关的,平时发现编译问题的时候可以有意识地练习下这些调试方法、工具(比如
--scan); - 自定义的参数读取可以多结合 Kotlin 代理特性来使用,另外跨模块的
extra的运用其实并不那么方便,因为 Key 作为 String 是比较松散的依赖关系,不少情况下可尝试使用buildSrc配合一些脚本来实现数据的共享;