我怎样才能让我的 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>'
我写了一个插件(目前只存在于 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>'