2017-08-09 888 views
0

我有一个在Windows 10上成功运行的多项目Gradle构建脚本。它读取并更新远离项目托管目录的Version.properties文件。 使用Gradle/groovy完成所有文件操作。在版本文件被读取,增加和重写之后,它被复制到build/classes目录,在那里它将被随后的jar和shadowjar任务拾取。Gradle clean build - 在清洁完成之前开始构建

gradle build shadowjar ... etc. 

但是,如果我调用建立文件之前清洁任务是阅读和适当增加,但该文件的副本静静地失败:如果我的Gradle调用如下
一切都像宣传的那样。

使用的命令是:

gradle clean build shadowjar 

我怀疑是gradle这个不等待清洁任务开始之前构建的任务完成。文件被读取并增加,但同时,多项目清理活动尚未完成。我尝试过在依赖项块,doFirst {}和doLast {}上进行尝试,并在构建过程中进一步推送文件副本。我的主要要求是在执行jar或shadowjar任务之前,先有Version.properties文件。我怀疑试图写入gradle的构建/目录,因为在gradle执行其活动时,可能无法将任何内容放入构建目录中。有什么方法可以确保Version.properties文件(或任何生成的文件)被复制?还是有另一个位置,我可以使用它不会在清理时被gradle吹走,但仍然可以在build中拾取:jar/build:shadowjar?

+0

你使用并行执行('--parallel' or'org.gradle.parallel = true')吗? 你正在使用哪个版本的Gradle? – bigguy

+0

gradle -version用Groovy 2.4.7返回Gradle 3.3。我没有启用--parallel我的build.gradle脚本中的任何地方。 – blyons

回答

0

您不应该在99.99%的时间内调用gradle clean,由于gradle的增量构建功能,它是多余的。所以只要你正确地定义你的任务输入和输出,并从每个任务开始,这个问题就解决了。

无论如何,在你的情况下,错误的顺序可能是干净和其他任务之间的依赖造成的,有没有?

+0

无论如何,clean和build都没有被修改过,这会导致其他人从默认的gradle行为开始。我相信我发布的答案是正确的:不要在任务中混淆gradle构建目录(即使是gradle构建任务本身 - 这是我的版本文件增量/副本被调用的地方)。通过将副本的目标设置到其他位置,问题消失并且副本成功。在构建之前调用clean的原因是为了确保在构建位置没有旧代码或测试执行。 – blyons

0

我发现了一种写出生成的Version.properties文件的方法,该文件将被jar和shadowjar任务拾取。使用gradle copy任务并将修改后的Version.properties文件放入资源目录中。构建活动包括在资源/后续任务(jar,shadowjar,test等)中找到的文件。我怀疑是因为干净地吹走构建目录gradle认为活动在开始构建时已完全完成。我认为我已经证明情况并非如此。 doFirst {},doLast {}和依赖关系{}似乎不能用作修饰符来清除构建。