gradle 从最终 jar 中不可用的任务生成的文件

gradle generated file from a task not available in final jar

我已经在 Android Studio 中设置了一些编译 libGdx 项目的任务。我想要的是,在资产文件夹中创建一个动态文件“version.txt”。该文件必须在最终的 jar 输出中可用。

我是这样设置的:

libGdx 给我提供了 dist 任务。 我在此基础上创建了两个任务:buildDebugVersionbuildReleaseVersion.

两者都应创建一个 version.txt,一个包含调试信息,另一个不包含调试信息。

libGdx'原始dist任务

task dist(type: Jar) {
    manifest {
        attributes 'Main-Class': project.mainClassName
    }
    //processResources.dependsOn tasks.updateVersionFileRelease
    dependsOn configurations.runtimeClasspath
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    with jar
}

我的debug/release任务

task createDebugVersion  {
    outputs.upToDateWhen { false }
    doFirst {
        modifyVersionFile(1)
    }
}

task createReleaseVersion  {
    outputs.upToDateWhen { false }
    doFirst {
        modifyVersionFile(0)
    }
}

任务相关性

为了让所有这些都按正确的 运行ning 顺序,我创建了

createDebugVersion.finalizedBy(tasks.dist)
createReleaseVersion.finalizedBy(tasks.dist)
dist.mustRunAfter(tasks.createDebugVersion, tasks.createReleaseVersion)

我的期望是:

当我查看输出时,这似乎发生了。可以看到,生成了什么文件:

这是我 运行 时的输出:

> Task :desktop:createReleaseVersion
Generated version file is:
--------------------------
Version=0.1.113
BuildDate=2020-04-24
--------------------------

BUILD SUCCESSFUL in 5s
10 actionable tasks: 9 executed, 1 up-to-date

...但是当我运行程序时,我看到这个版本信息:

jar 中包含的文件总是落后1 或 2 个版本,就好像它已经从某个缓存文件夹中取出一样。

让我害怕的是这个问题:有多少其他资产现在也落后 1 或 2 个版本? gradle 从哪里获取这个文件?

到目前为止我没能找到它。

我已经尝试过的

我 运行 通过 .cmd 脚本。在开始 gradle 任务之前,我已经删除了所有构建文件夹(并对其进行了测试,在构建开始之前删除了所有内容)

(变量 %TASK% 包含 createDebugVersioncreateReleaseVersion

ECHO Forcing resources rebuild
RD /S /Q .\desktop\build
RD /S /Q .\android\build

ECHO Compiling distribution version of %GAMENAME%...
CALL gradlew desktop:clean desktop:build %TASK% --rerun-tasks

但是,在某些“ghost-galaxy-space”中,从某处获取了两个旧版本的文件并放入 jar...

任何帮助非常感谢

好的,我想通了 - 如果其他人 运行 遇到类似的问题,也许它可以帮助他们。

错误在这里:

CALL gradlew desktop:clean desktop:build %TASK% --rerun-tasks

如果仔细观察,您会看到第一个 desktop:clean 运行,然后 desktop:build runs,由于删除了缓存和构建文件夹而导致完全重建,然后是我的%TASK% 运行s - 顺序为 第三

所以,我的任务 运行s 构建之后。即使我用

建立构建链
createDebugVersion.finalizedBy(tasks.dist)
createReleaseVersion.finalizedBy(tasks.dist)

这一切仅 运行s 构建完成后。 dist 任务在此构建链中没有 clean,因此它使用我的 gradlew 调用的第二个参数生成的构建输出!

解决方案

我只是改变了我的方式 运行 gradlew:

我的命令脚本现在调用

call gradlew desktop:clean %TASK% --rerun-tasks

所以 clean 仍然是强制的,但是 build 只是作为 dist 的反应而发生的,因为它找不到任何二进制文件,所以它必须正确构建它们现在。 然后 然后 构建最终 运行s 我的文件被写入资产文件夹后

希望有一天这对某人有所帮助! 干杯,格里斯