Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.5——在项目中共享配置
问题:
取出多个模块下相同的配置
解决方案:
在顶级gradle配置文件里面使用allprojects或者subprojects块
讨论:
当你在android studio中新建android项目时,IDE创建了一个两级的gradle项目,一个配置文件在根目录下,一个在叫app的模块目录下。顶级的build.gradle有几个叫allprojects的块:
这个块是gradle的语法,所以不只是在adroid项目中,在所有基于gradle的项目中都能使用。allprojects属性来源于Gradle项目中的类org.gradle.api.Project的属性。这个属性由当前项目和所有子项目的集合组成。另外有一个也叫这个名字的方法,允许你配置当前项目和所有子项目。
PS:在gradle API中年经常有一个属性和方法同名。上下问会判断你使用的哪个。
做法是将闭包参数应用于allprojects集合中的每个项目。也就是说你不需要在子项目(app)中重复repositories块,因为它们已经存在了。
一个可以替代的方式是使用subprojects块。举例说,如果你有多个android库项目,每个都会在build文件应用库插件。如果每个子项目都是类库项目,你通过在上级配置中应用这个插件的方式,去掉重复的配置,如:
subprojects返回一个子项目的集合,并且有个叫subprojects的方法对他们使用闭包。
进一步思考:
如果查看allprojects方法的文档你会发现,这个方法使用一个叫org.gradle.api.Action的类做参数。签名如下:
文档说这个方法对当前项目和所有子项目执行给定的Action。Action<T>是一个只有一个参数的叫做execute的简单方法。这好像暗示你要创建一个实现Action接口的类,实例化它,并且将结构作为参数。在1.8以前的java,这经常用作匿名内部类。
在Groovy中,你可以简单的使用闭包作为参数来实现单方法的接口。闭包会成为方法实现。Gradle对allprojects和subprojects方法的实现,是将闭包参数应用于每个项目。