首页 > 解决方案 > gradle 从最终 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
}

我的调试/发布任务

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

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

任务依赖

为了把这一切都放在正确的运行顺序中,我创建了

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

但是,在一些“幽灵星系空间”中,一个两个版本的旧文件被从某个地方取出并放入罐子中......

非常感谢任何帮助!

标签: gradlejarlibgdx

解决方案


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

错误在这里:

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

如果您仔细观察,您会看到 FIRSTdesktop:clean运行 THEN desktop:build runs,由于已删除缓存和构建文件夹,这会导致完全重建,然后是我的%TASK%运行 - 按顺序排在第三位!

所以,我的任务在构建之后运行。即使我建立了构建链

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

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

解决方案

我只是改变了我的跑步方式gradlew

我的命令脚本现在调用

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

所以 aclean仍然是强制的,但build唯一的反应是dist因为它找不到任何二进制文件,所以它必须立即构建它们。然后我的文件被写入资产文件夹,构建最终运行。

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


推荐阅读