Gradle: 多项目依赖:同名任务一起执行

Gradle: Multi-project dependency: Tasks of the same name executing together

我的 gradle 构建中有一个多项目依赖项,但有一个功能有点妨碍我。每当我调用一个存在于两个项目中的任务名称时,它都会同时调用它们。我不喜欢那样。

我的目录结构如下:

[Root]
---->[projA]
----------->build.gradle
---->[projB]
----------->build.gradle

所以我的代码中有 projB 依赖于 projA。 假设我在 projB 中有一个任务 运行:

task run << {
    println 'projB running'
}

而且我在 projA 中还有一个任务 运行:

task run << {
    println 'projA running'
}

通过调用 gradle 运行,我会得到

:run
projB running
:projA:run
projA running

有什么方法可以防止某些任务具有这种依赖性吗?其中一些,说 clean 很好,但我更愿意将特定任务分开(不必更改命名方案)。

可以通过以下任一方式实现我想要的效果:

gradle run -x :projA:run

gradle :run

不过,我想要构建文件中的解决方案。

谢谢!

projB 声明对 projA 的项目依赖这一事实与您所看到的行为无关。如果您从多项目构建的根项目执行任务,Gradle 将尝试在其子项目的 any 中找到具有请求名称的任务并执行它。此功能称为 task execution matching。鉴于此默认行为,Gradle 无法知道从根项目执行 gradle run 时您指的是哪个 run 任务。我建议您按照我之前的评论中提到的那样在命令行上定义要执行的内容。

如果你真的想在构建脚本中添加逻辑,那么你可以使用以下代码实现它:

def taskRequests = gradle.startParameter.taskRequests
def runTaskRequest = taskRequests.find { it.args.contains('run') }

if (runTaskRequest) {
    gradle.startParameter.excludedTaskNames = [':projA:run']
}

如果您执行命令 gradle run,所提供的代码将阻止执行子项目 projArun 任务。请记住,如果您导航到 projA 子目录和 运行 同一命令,它也会排除 :projA:run。如果您仍希望能够从子目录执行 run 任务,则必须构建额外的逻辑。