Gradle 多模块任务依赖关系

Gradle 多模块任务依赖关系,gradle,gradle-plugin,Gradle,Gradle Plugin,我希望一个任务的输出可以用于另一个子模块中的相同任务 我正在尝试制作另一个用于编译(C/++、.hs、.coffee、.js等)和源代码生成的插件。 因此,我正在制作一个插件和任务,它(到目前为止)为每个模块生成CMakeLists.txt、Android.mk、.vcxproj或其他任何构建源代码的模块 我有一个多模块构建。 我可以从“其他”子模块中找到任务,但是,我似乎无法强制执行任何执行顺序 所以,用 根项目:RootModule 子项目:NativeCommandLine(需要共享模

我希望一个任务的输出可以用于另一个子模块中的相同任务

我正在尝试制作另一个用于编译(C/++、
.hs
.coffee
.js
等)和源代码生成的插件。 因此,我正在制作一个插件和任务,它(到目前为止)为每个模块生成
CMakeLists.txt
Android.mk
.vcxproj
或其他任何构建源代码的模块

我有一个多模块构建。 我可以从“其他”子模块中找到任务,但是,我似乎无法强制执行任何执行顺序

所以,用

  • 根项目:RootModule
    • 子项目:NativeCommandLine(需要共享模块)
    • 子项目:NativeGUI(需要SharedModule)
    • 子项目:SharedModule
。。。我发现
NativeGUI
任务在
SharedModule
之前执行,这意味着
SharedModule
结果尚未就绪

糟糕

由于
依赖项{…}
的东西发生在插件安装之后(AFAIK)。。。我猜这些依赖项是在之后连接的

我需要根据依赖关系按顺序执行任务。。。正确的?我如何才能做到这一点?

我创建了一个(scala)
任务包
,它惰性地注册所有参与的
任务
实例的集合。 我将我的任务的实例添加到其中,并在新任务出现时添加一个处理程序

在配置过程中,任何任务都可以在lambda中包含逻辑,以过滤其他任务并对其执行操作,并且在两个任务都参与时立即执行

package peterlavalle

import java.util

import org.gradle.api.Task

object TaskBag {

    class AnchorExtension extends util.LinkedList[(Task, Task => Unit)]()

    /**
        * connect to the group of tasks
        */
    def apply(task: Task)(react: Task => Unit): Unit =
        synchronized {
            // lazily create the central anchor ... thing ...
            val anchor: AnchorExtension =
                task.getProject.getRootProject.getExtensions.findByType(classOf[AnchorExtension]) match {
                    case null =>
                        task.getProject.getRootProject.getExtensions.create(classOf[AnchorExtension].getName, classOf[AnchorExtension])
                    case anchor: AnchorExtension =>
                        anchor
                    }

            // show us off to the old ones
            anchor.foreach {
                case (otherTask, otherReact) =>
                    require(otherTask != task, "Don't double register a task!")
                    otherReact(task)
                    react(otherTask)
            }

            // add us to the list
            anchor.add(task -> react)
        }

}