如何从与Gradle并行的特定子目录轻松构建项目?

时间:2014-11-10 15:50:35

标签: gradle

我有一个多项目(Android)版本,库 L ,app A ,示例 E1 E2 < / em>, E3 (可能还有更多)。目录布局是:

root (contains `settings.gradle` and `build.gradle`)
|
+- A (contains `build.gradle`)
|
+- L (contains `build.gradle`)
|
+- examples
   |
   +- E1 (contains `build.gradle`)
   |
   +- E2 (contains `build.gradle`)
   |
   +- E3 (contains `build.gradle`)

A 取决于 L ,而每个 E&lt; n&gt; 也依赖于 L (但不是 A 的)。示例存储在examples/E<n>子目录中,每个示例都有自己的build.gradle文件。 A L ,示例项目包含在根settings.gradle文件中(settings.gradle中没有examples/个文件)。

由于所有示例都是相互独立的,我想并行构建它们,而不是在命令行上单独指定它们。相反,我希望能够从根目录中简单地编写类似./gradlew examples的内容来执行此操作。

我可以创建task examples(dependsOn: E1:assembleDebug, E2:assembleDebug, E3:assembleDebug),但如果添加新示例,则无法很好地扩展。我可能还可以挂钩tasks.whenAdded然后修改examples项目的依赖项,但这看起来不是很干净。

那么,是否有一种优雅的方法来创建一个只是并行地从某个子目录构建其他任务的任务?似乎还有一个group that a project can belong to,所以一个简单的方法来并行构建给定组的所有项目也没关系。

2 个答案:

答案 0 :(得分:1)

include "examples"中添加settings.gradle后,您就可以从gradlew assembleDebug目录运行examples了。如果您想要更多,还可以将以下内容添加到examples/build.gradle

task examples {
    dependsOn { subprojects.assembleDebug }
}

答案 1 :(得分:1)

基于@ peter-niederwieser的回答和评论,我能够通过将其添加到根build.gradle文件中来实现我想要的目标:

task examples {
    description 'Builds all examples.'

    dependsOn {
        subprojects.findAll {
            it.projectDir.parentFile.name == 'examples'
        }.assemble
    }
}

此解决方案既不依赖于示例项目命名,也不依赖项目的组名称(如果在projectDir中手动修改项目的settings.gradle,则不等于目录名称。)