多模块任务依赖
Multi-Module Task Dependencies
我希望一个任务的输出可用于另一个子模块中的相同任务。
我正在尝试制作另一个用于编译(C/++、.hs
、.coffee
、.js
等)和源代码生成的插件。
因此,我正在制作一个插件和 task/s,它(到目前为止)为每个模块生成 CMakeLists.txt
、Android.mk
、.vcxproj
或其他任何内容以构建源代码。
为此我有一个多模块构建。
我可以四处寻找 "other" 个子模块中的任务,但是,我似乎无法强制执行任何执行顺序。
所以,与...
- 根项目:RootModule
- 子项目:NativeCommandLine(需要 SharedModule)
- 子项目:NativeGUI(需要SharedModule)
- 子项目:SharedModule
...我发现 NativeGUI
任务在 SharedModule
之前执行,这意味着 SharedModule
结果尚未准备好。
不好。
因为 dependency { ... }
事情发生在插件安装后(AFAIK)...我猜依赖关系是在安装之后连接的。
我需要根据依赖关系按顺序执行我的任务...对吗?我该怎么做?
我创建了一个 (scala) 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)
}
}
我希望一个任务的输出可用于另一个子模块中的相同任务。
我正在尝试制作另一个用于编译(C/++、.hs
、.coffee
、.js
等)和源代码生成的插件。
因此,我正在制作一个插件和 task/s,它(到目前为止)为每个模块生成 CMakeLists.txt
、Android.mk
、.vcxproj
或其他任何内容以构建源代码。
为此我有一个多模块构建。 我可以四处寻找 "other" 个子模块中的任务,但是,我似乎无法强制执行任何执行顺序。
所以,与...
- 根项目:RootModule
- 子项目:NativeCommandLine(需要 SharedModule)
- 子项目:NativeGUI(需要SharedModule)
- 子项目:SharedModule
...我发现 NativeGUI
任务在 SharedModule
之前执行,这意味着 SharedModule
结果尚未准备好。
不好。
因为 dependency { ... }
事情发生在插件安装后(AFAIK)...我猜依赖关系是在安装之后连接的。
我需要根据依赖关系按顺序执行我的任务...对吗?我该怎么做?
我创建了一个 (scala) 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)
}
}