我有一个名为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
?我正在寻找适用于所有构建版本和所有潜在调用(构建/运行/调试)的解决方案。
答案 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
称为依赖项。当然,您可以修改匹配的闭包以满足您的需求。