多模块任务依赖关系

时间:2018-04-24 11:47:43

标签: gradle gradle-plugin

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

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

我有一个多模块构建。 我可以到处找到来自"其他"的任务。子模块,但是,我似乎无法执行任何执行命令。

所以,有......

  • root项目:RootModule
    • 子项目:NativeCommandLine(需要SharedModule)
    • 子项目:NativeGUI(需要SharedModule)
    • 子项目:SharedModule

...我发现NativeGUI任务在SharedModule之前执行,这意味着SharedModule结果尚未准备就绪。

坏。

由于dependency { ... }内容在安装插件后发生(AFAIK)......我猜测依赖关系是在之后连接的。

我需要根据依赖关系按顺序执行我的任务......对吗?我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

我创建了一个(标量)TaskBag,它懒惰地注册了所有参与的Task实例的集合。 我向其中添加了任务的实例,以及新任务何时出现的处理程序。

在配置过程中,任何任务都可以在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)
        }

}