如何使我的Gradle插件自动执行其任务?

如何使我的Gradle插件自动执行其任务?,gradle,gradle-plugin,Gradle,Gradle Plugin,我编写了一个插件(目前只存在于buildSrc中),它创建了几个任务,这些任务的名称基于用户提供的值。我如何使它们在应用插件的构建脚本运行时执行?它不需要在执行阶段的任何特定点运行。实现这一点的一种方法是使用TaskCollection上的all方法向项目中的所有(或部分)任务添加/关系 创建单个myTask的示例,其中allproject中的每个任务取决于它: classmyplugin实现插件{ 无效申请(最终项目){ final myTask=project.tasks.create('m

我编写了一个插件(目前只存在于buildSrc中),它创建了几个任务,这些任务的名称基于用户提供的值。我如何使它们在应用插件的构建脚本运行时执行?它不需要在执行阶段的任何特定点运行。

实现这一点的一种方法是使用
TaskCollection
上的
all
方法向项目中的所有(或部分)任务添加/关系

创建单个
myTask
的示例,其中
allproject
中的每个任务取决于它:

classmyplugin实现插件{
无效申请(最终项目){
final myTask=project.tasks.create('myTask'))
project.allprojects.each{proj->
项目任务。全部{
//确保不要添加循环依赖项
if(it!=myTask){
it.dependsOn(我的任务)
}
}
}
}
}

首先,您要围绕一个基本的渐变概念展开工作。Gradle任务并非设计为在每次Gradle调用上运行。如果您确实需要在每个Gradle调用上运行代码,请在配置阶段直接执行它,而不是将其包装到任务中

但是,任务在Gradle构建上运行有两个原因:

  • 直接选择(通过命令行或
    设置.startParameter.taskNames
    修改)
  • 通过一个或多个任务依赖项(
    dependsOn
    /
    finalizedBy
当然,您可以使用这些方法中的一种来绕过Gradle,并在每个构建上执行任务(@mkobit使用了第二种方法),但由于您的插件基本上违反了Gradle的基本原则,您的解决方案可能会在未来某个时间或更复杂的项目中失败(因为插件应该是可重用的)

作为总结,我建议您将所有生成的任务捆绑在一个具有固定名称的任务中,这样您的用户就可以通过在其
设置中放入一行,在每次Gradle调用中轻松运行任务。Gradle
文件:

startParameter.taskNames.add '<bundleTask>'
startParameter.taskNames.add''

首先,为什么要这样做?你想达到什么目标?第二,在构建中,您希望何时运行它们?最后?他们有依赖关系吗?或任何输入?还是取决于特定类型的任务?或者这些任务依赖于它吗?有很多方法可以做到这一点,但这取决于你想完成什么。@mkobit这是一个Android项目,重要的是任务在应用程序启动之前完成。这几乎不是一个限制,因为我很确定Gradle甚至不负责推送和启动应用程序。没有依赖项或输入,它们是完全独立的。即使没有连接任何设备,或者当前任务甚至不是构建(例如,clean),它们也可以运行。如果可能,我希望在插件中运行任务的代码,而不是构建脚本。“如果可能,我希望在插件中运行任务的代码,而不是构建脚本。”在构建脚本中所能做的一切都可以在插件中实现。下面是一个非常好的真实示例,说明如何在Android项目中实现这一点:感谢您的清晰解释。我不知道设置。启动参数。任务名。我真的很喜欢这个想法。我添加了一个关于如何解决您的具体问题的建议。谢谢,这似乎是一个非常可靠的解决方案。我想我要走那条路。我有一部分人想在配置阶段运行我的代码,但这感觉有点“错误”。回答得好,我同意这里的一切。在某些用例中,您确实希望始终运行任务(例如报告、度量等),但在大多数情况下,您希望根据输入和输出以及它们之间的依赖关系来组织任务。