在gradle android项目中的所有可能的打包任务之前运行自定义任务

时间:2017-06-14 20:52:34

标签: android gradle

我有一个名为data-android的gradle项目,它应用了com.android.library插件。在打包阶段之前,我想要执行我自己的一个自定义任务(名为copySqlMigrations)。此任务将一堆资产复制到项目树中。

我做了很多次尝试,但没有一次普遍适用。 我得到的最接近的是将以下内容添加到我的gradle文件的末尾。

afterEvaluate {
    assemble.dependsOn copySqlMigrations
    assembleDebug.dependsOn copySqlMigrations
    assembleRelease.dependsOn copySqlMigrations
}

只有在我打电话时才会这样做直接gradle assembleDebug,但是当我想启动我的APK(我的图书馆项目是一个依赖项)时,这就失败了。

Error:(56, 1) A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugApk'.
   > A problem occurred configuring project ':data-android'.
      > Could not get unknown property 'assembleDebug' for project ':data-android' of type org.gradle.api.Project.

在打包此项目之前,我怎样始终调用:data-android:copySqlMigrations?我正在寻找适用于所有构建版本和所有潜在调用(构建/运行/调试)的解决方案。

1 个答案:

答案 0 :(得分:1)

Gradle的TaskContainer可通过(project.)tasks访问。此容器也是包含所有任务的TaskCollection。可以通过TaskCollection方法查询子集matching,并且由于某些魔法,新的TaskCollection是有效的。因此,每当新任务添加到父TaskCollection(或TaskContainer)并且它与matching方法的闭包匹配时,子集TaskCollection将包含它。与TaskCollection all方法一起,无论何时创建模式,都可以处理模式后的每个任务。

对于您的问题中陈述的问题,我编写并测试了以下构建文件:

task assembleX { }

task copySqlMigrations { }

task assembleY { }

tasks.matching { task ->
    task.name.startsWith('assemble')
}.all { task ->
    task.dependsOn copySqlMigrations
}

task assembleZ { }

您可以调用每个assemble*任务,它会将copySqlMigrations称为依赖项。当然,您可以修改匹配的闭包以满足您的需求。