解决方案
用于最终寻找到摇篮这挑衅性的问题提供动力。我还没有使用过,所以我只能提供分析指出,一边浏览文档,而不是个人的故事。
我的第一个问题是为什么摇篮任务依赖图被保证是无环的。我没有找到这个问题的答案,但相反的情况下,很容易构建,所以我推测,循环检测是当图表构建了一个运行验证,在此之前的第一个任务,如果执行构建失败有违法周期性的依赖关系。而不需要先建立这个图中,故障情况可能不会被发现,直到构建基本完成。此外,检测程序将不得不在每次执行任务后运行,这将是非常低效的(只要图表是增量和可用的全球建成,深度优先搜索将只需要找到一个起点,以后的周期评估将需要最少的工作,但总的工作仍然会做比对当初整套关系)单减持更大。我会记下及早发现作为一个重大的好处。
一个任务依赖性可以是懒(参见:4.3任务依赖关系,并在13.14相关的示例)。懒惰任务相关性可能直到整个图表内置无法正确评估。这同样适用于传递(非工作)解决依赖,这可能会导致无数问题,需要反复重新编译为额外的依赖的发现和解决(也需要反复要求的储存库)真。任务规则功能(13.8)是不可能的要么。这些问题,并有可能许多人一样,可以通过考虑摇篮使用动态语言来概括,并能动态地添加和修改任务,所以之前的第一通评价,因为执行路径是建立结果可能是不确定性的,在运行时修改,因此,不同的评价序列可以产生任意不同的结果,如果有依赖关系或行为的指令是未知的,直到后来,因为他们还没有被创建。 (这可能是堪与一些具体的例子调查。如果这是真的,那么即使两个路径并不总是足够如果A - > B,B - > C,其中C改变的,以便它不再是行为依赖于B,那么你有一个问题,我希望有关于限制元编程与非本地范围的一些最佳做法,不允许它在任意的任务。一个有趣的例子是一个时间旅行悖论的模拟,其中一个孙子杀死祖父或结婚祖母,生动地示出了一些实际伦理原则!)
它可以实现更好的状态和进度上当前正在执行的创建报表。一个TaskExecutionListener提供前/挂钩到每个任务的处理之后,但不知道剩余任务的数量,没有太多它可以说比约其他身份“6个任务完成。关于执行任务FOO”。相反,你可以初始化与gradle.taskGraph.whenReady任务的数量TaskExecutionListener,然后将其连接到TaskExecutionGraph。现在,它可以提供信息,使报告的细节,如“72 6的任务完成现在正在执行的任务富剩余所需时间:。小时38米。”如果正在使用摇篮编排的大型多项目构建和时间估计是至关重要的,这将是一个控制台上显示为持续集成服务器比较有用。
正如杰里布拉德指出,生命周期的评估部分是确定执行计划,它提供了关于环境的信息关键的,因为环境的一部分被由DAG部分中的配置的执行上下文(实施例4.15确定)。此外,我可以看到执行优化这个是有用的。 Independ耳鼻喉科子路径可以安全地交给不同的线程。步行执行算法可以是更少的存储器密集,如果他们不幼稚(我的直觉说总是走最子路径的路径会导致更大的堆比总是倾向于用最少的子路径的路径)。
这是有趣的使用,这可能是其中一个系统的很多部件都开始掐灭支持演示和增量开发的情况。然后在开发过程中,而不是更新的生成配置,因为每个组件成为实施,构建本身可能确定一个子项目是准备纳入,但(也许它试图抢代码,编译并运行一个预先确定的测试套件) 。如果是,评估阶段将揭示这一点,相应的任务将包括在内,否则,它选择了存根的任务。也许有不可用的Oracle数据库的依赖关系着呢,你在此期间使用的嵌入式数据库。您可以让构建查询的可用性,透明地切换时是可以的,告诉你,它交换数据库,而不是你告诉它。可能有大量的沿着这些线路创造性的用途。
摇篮看起来真棒。感谢挑起一些研究!
其他提示
href="http://www.gradle.org/0.8/docs/userguide/tutorial_using_tasks.html#configure-by-dag"来自同一文档一个rel="nofollow noreferrer">例的示出了这种方法的功率:
由于我们描述在全后面详细 (参见第30章,构建生命周期) 摇篮具有这样的配置相和 的执行阶段。之后 配置阶段摇篮知道所有 应该执行的任务。摇篮 为您提供一个钩子利用这一 信息。用例因为这将 要检查是否发布任务 要执行的任务的一部分。 根据这一点,你可以分配 不同的值,以一些变量。
换句话说,可以钩到构建过程早,所以可以根据需要改变其路线。如果已经进行了一些实际的构建工作,它可能是太晚了改变。
我现在正在评估不同的编译系统,并与gradle这个我设法补充丑陋的代码枚举类型“JAR”的所有任务,并改变他们,所以,每一个JAR清单包括“集结号”属性(稍后使用以组成最终的文件名):
gradle.taskGraph.whenReady {
taskGraph ->
taskGraph.getAllTasks().findAll {
it instanceof org.gradle.api.tasks.bundling.Jar
}.each {
it.getManifest().getAttributes().put('Build-Number', project.buildVersion.buildNumber)
}
}