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

标签 gradle jar libgdx

我已经在Android Studio中设置了一些编译libGdx项目的任务。我要的是在 Assets 文件夹中创建一个动态文件“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)
我的期望是:
  • createdebug / release运行并创建文件
  • 然后, dist运行

  • 当我查看输出时,似乎发生了这种情况。您可以看到生成了什么文件:
    这是我运行它时的输出:
    > 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
    
    ...但是当我运行程序时,我看到以下版本信息:
    enter image description here
    jar中包含的文件始终落后1或2个版本,就好像它已从某些缓存文件夹中取出一样。
    问题让我感到恐惧:现在还有多少其他 Assets 落后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
    
    但是,仍然从某些“鬼影星系空间”中,从某个地方取出了两个旧版本的文件,并将其放入 jar 中...
    任何帮助,不胜感激!

    最佳答案

    好的,我想通了-如果其他人遇到类似问题,也许对其他人有帮助。
    错误在这里:

    CALL gradlew desktop:clean desktop:build %TASK% --rerun-tasks
    
    如果仔细观察,您会看到第一个desktop: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
    
    因此clean仍然是强制性的,但是build仅作为dist的响应而发生,因为它找不到任何二进制文件,因此必须立即构建它们。
    然后,在将我的文件写入 Assets 文件夹之后,构建最终运行。
    希望有一天能对某人有所帮助!
    欢呼,格里斯

    关于gradle - gradle从最终jar中不可用的任务生成的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61402916/

    相关文章:

    java - maven 依赖 jar 文件显示为文件夹图标

    java - 我应该拆分纹理图集吗?

    android - 使用AdMob打开Android应用时崩溃

    java - 如何在纹理上绘制像素图?

    maven - 如何使用 Maven 构建 Gradle 插件

    android - 未找到符号目录 - 请检查您的 native 调试配置

    java - 我可以在 JAVA STATEMENT 中获取 "gradle.properties"中定义的属性吗?

    gradle - 如何在 gradle 中使用 exec() 输出

    java - 要使用 SSL,我的 JAR 文件是否应该签名?

    gradle - 如何从 java TestRunner 类运行 cucumber 测试