我的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
我想要一个在构建文件中的解决方案。
谢谢!
答案 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
任务,那么您必须构建其他逻辑。