2013-04-25 91 views
6

是它在某种程度上可能执行任务的依赖性时任务将被跳过?在Gradle中跳过依赖执行被禁用的任务吗?

在下面的例子,我想jar(和jar的依赖关系)如果执行runServerTests当服务器已经在运行被执行以。在这种情况下,服务器将由另一个进程启动。

apply plugin: 'java' 

task startServerIfNotRunning(dependsOn: jar) { 
    onlyIf { isServerNotRunning() } 
    ... 
} 

task runServerTests(dependsOn: startServerIfNotRunning) { ... } 

我宁愿不添加onlyIfjar任务,因为这总是应该可以根据一个执行其他任务。 jar任务也具有自己的依赖关系。

+1

我不知道答案在这里,但如果你的服务器依赖于罐子,罐子是过时的,为什么你不想要重新启动服务器?如果罐子是最新的和所有它的依赖是最新的,然后它不花费你太多的时间为jar任务不执行任何操作... – erdi 2013-04-25 17:26:10

+0

当你这样做有他的道理,我们确实有很多的子项目,因此即使所有内容都是最新的,也需要大约15-30秒才能完成“重新编译”。如果可能的话,我想摆脱这个时间。大部分时间服务器将会是最新的。 – 2013-04-26 10:19:36

+0

见http://stackoverflow.com/questions/18624391/how-to-set-onlyif-for-dependencies-of-gradle-task/18877504#18877504 – 2013-09-18 16:28:55

回答

3

为了获得所需的行为,你必须从任务执行图形中排除的任务,而不是跳过它的执行。您可以-x在命令行用gradle.startParameter.excludedTaskNames << "..."gradle.taskGraph.useFilter { task -> ... }做到这一点或编程。

+0

好,谢谢。我猜这一定是在配置阶段完成的? – 2013-04-26 15:26:51

+0

是的。在执行阶段,任务执行图不能再被改变。 – 2013-04-26 18:40:28

+0

@PeterNiederwieser你能否更详细地解释或指出你提到的第二种方法的细节? 我无法在相关文档中找到“userFilter”http://www.gradle.org/docs/current/javadoc/index.html?org/gradle/api/execution/TaskExecutionGraph.html – ZenBalance 2013-07-25 21:06:08

2

你可以做这样的事情

task startServerIfNotRunning(dependsOn: jar) { 
    if (isServerNotRunning()) { 
     enabled = false; 
     dependsOn = []; 
    } 
} 

if语句我们在配置阶段评估和相关任务将被删除。我已经用代码和输出在Skipping Gradle Tasks中总结了这一点。看一看。

+0

然而,这有一个缺点,那就是每次都会在Gradle的配置阶段调用'isServerNotRunning()',而不是在执行此任务时。 – 2014-12-31 10:48:01

+1

不,您的示例中的代码在_configuration阶段_中执行,并且在此阶段中始终配置所有任务(在当前项目中)。这些任务并不总是执行,但那不是我所说的。我已经在Gradle 2.2.1中验证了这一点,这是写作时的最新版本。 – 2015-01-02 20:36:42

+0

你说得对,那是一个缺点。使用旧版本进行验证。我收回我以前的评论。 – 2015-01-03 05:27:22