【问题标题】:Gradle clean build - build kicks off prior to clean completingGradle clean build - 在 clean 完成之前开始构建
【发布时间】:2017-08-11 05:45:58
【问题描述】:

我有一个在 Windows 10 上成功运行的多项目 Gradle 构建脚本。它读取并更新位于项目管理目录之外的 Version.properties 文件。 所有文件操作都是使用 Gradle/groovy 完成的。在读取、递增和重写版本文件后,它将被复制到 build/classes 目录中,随后的 jar 和 shadowjar 任务将在该目录中获取它。
如果我按以下方式调用 gradle,一切都会像宣传的那样工作:

gradle build shadowjar ... etc.

但是,如果我在构建之前调用 clean 任务,则会正确读取和递增文件,但文件副本会静默失败。

使用的命令是:

gradle clean build shadowjar

我怀疑 gradle 在开始构建任务之前不会等待清理任务完成。该文件被读取并递增,但同时,多项目清理活动尚未完成。我尝试了依赖项{} 块、doFirst{} 和 doLast{} 的变体,以尝试在构建过程中进一步将文件副本推回。我的主要要求是在执行 jar 或 shadowjar 任务之前准备好 Version.properties 文件。我怀疑尝试写入 gradle 的 build/ 目录,因为在 gradle 执行其活动时,可能无法将任何内容放入 build 目录中。有没有办法确保 Version.properties 文件(或任何生成的文件)被复制?或者是否有另一个我可以使用的位置在干净的时候不会被 gradle 吹走,但仍然会在 build:jar / build:shadowjar 中被拾取?

【问题讨论】:

  • 您是否使用并行执行(--parallelorg.gradle.parallel=true)?您使用的是哪个版本的 Gradle?
  • gradle -version 返回 Gradle 3.3 和 Groovy 2.4.7。我没有在 build.gradle 脚本中的任何地方启用 --parallel。

标签: windows gradle


【解决方案1】:

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

无论如何,在您的情况下,错误的顺序可能是由 clean 和其他任务之间的依赖关系引起的,有吗?

【讨论】:

  • clean 和 build 并没有以任何方式进行修改,这会导致一个人以默认的 gradle 行为从其他人开始。我相信我发布的答案是正确的:不要在任务中弄乱 gradle build 目录(即使是 gradle build 任务本身 - 这是我的版本文件增量/副本被调用的地方)。通过将复制的目标设置为不同的位置,问题就会消失并且复制成功。在构建之前调用 clean 的原因是确保构建位置没有旧代码或测试执行。
【解决方案2】:

我找到了一种写出生成的 Version.properties 文件的方法,该文件将被 jar 和 shadowjar 任务拾取。使用 gradle 复制任务并将修改后的 Version.properties 文件放入资源目录。构建活动包括在后续任务(jar、shadowjar、test 等)中的资源/中找到的文件。我的怀疑是,因为 clean 吹走了构建目录,所以 gradle 假定该活动在开始构建时已经完全完成。我认为我已经证明事实并非如此。 doFirst{}、doLast{} 和依赖项{} 似乎不能用作清理构建的修饰符。

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 1970-01-01
    • 2015-05-15
    • 2011-08-19
    • 1970-01-01
    • 2016-04-16
    • 2013-04-05
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多