我怎样才能让我的 Gradle 插件自动执行它的任务?

How can I make my Gradle plugin auto-execute its tasks?

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

实现此目的的一种方法是在 TaskCollection 上使用 all 方法来为项目中的所有(或部分)任务添加 dependsOn/finalizedBy 关系。

根据 allproject 中的每个任务创建单个 myTask 的示例:

class MyPlugin implements Plugin<Project> {
  void apply(final Project project) {
    final myTask = project.tasks.create('myTask')
    project.allprojects.each { proj ->
      proj.tasks.all {
        // Make sure to not add a circular dependency
        if (it != myTask) {
          it.dependsOn(myTask)
        }
      }
    }
  }
}

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

但是,任务 到 Gradle 构建中的 运行 有两个原因:

  • 直接选择(通过命令行或settings.startParameter.taskNames修改)
  • 通过一个或多个任务相关性(dependsOn / finalizedBy

当然你可以使用这些方法之一来规避 Gradle 并在每次构建时执行你的 task(@mkobit 使用了第二种方法),但是因为你插件基本上会破坏基本的 Gradle 原则,您的解决方案可能会在未来某个时间或更复杂的项目中失败(因为插件应该是可重用的)。

总而言之,我建议将您生成的所有任务捆绑在一个具有常量名称的任务中,这样您的用户就可以轻松地 运行 在每次 Gradle 调用时放置一个任务他的 settings.gradle 文件中的一行:

startParameter.taskNames.add '<bundleTask>'