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

时间:2016-09-06 20:49:34

标签: java gradle task project build.gradle

我的gradle构建中有一个多项目依赖项,但是有一个功能在我的方式上有所帮助。每当我调用两个项目中都存在的任务名称时,它都会调用它们。我不喜欢这样。

我的目录结构如下:

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

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

task run << {
    println 'projB running'
}

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

task run << {
    println 'projA running'
}

通过调用 gradle run ,我会得到

:run
projB running
:projA:run
projA running

有没有办法阻止某些任务产生这种依赖?其中一些,说 clean 很好,但我更喜欢将特定任务分开(无需更改命名方案)。

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

gradle run -x :projA:run

gradle :run

我想要一个在构建文件中的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

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

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

如果执行命令run,则提供的代码将阻止子项目projA的{​​{1}}任务的执行。请记住,如果您导航到gradle run子目录并运行相同的命令,它也会排除:projA:run。如果您仍希望能够从子目录执行projA任务,那么您必须构建其他逻辑。