gradle - gradle 从最终 jar 中不可用的任务生成的文件
问题描述
我已经在 Android Studio 中设置了一些编译 libGdx 项目的任务。我想要的是,在资产文件夹中创建一个动态文件“version.txt”。该文件必须在最终的 jar 输出中可用。
这是我进行设置的方式:
libGdx 为我提供了一项dist
任务。我在此之上创建了两个任务:buildDebugVersion
和buildReleaseVersion
.
两者都应创建一个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
...但是当我运行程序时,我看到了这个版本信息:
jar 中包含的文件总是落后 1 或 2 个版本,就好像它会从某个缓存文件夹中取出一样。
让我害怕的是一个问题:有多少其他资产现在也落后了 1 或 2 个版本?gradle 从哪里获取这个文件?
到目前为止,我无法找到它。
我已经尝试过的
我通过.cmd
脚本运行它。在开始 gradle 任务之前,我已经删除了所有构建文件夹(并对其进行了测试,在构建开始之前所有内容都已删除)
(变量 %TASK% 包含createDebugVersion
或createReleaseVersion
)
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
但是,在一些“幽灵星系空间”中,一个两个版本的旧文件被从某个地方取出并放入罐子中......
非常感谢任何帮助!
解决方案
好的,我想通了 - 如果他们遇到类似的问题,也许它可以帮助其他人。
错误在这里:
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
因为它找不到任何二进制文件,所以它必须立即构建它们。然后在我的文件被写入资产文件夹后,构建最终运行。
希望有一天这对某人有所帮助!干杯,格里斯
推荐阅读
- nginx-location - 使用 ingress-nginx 记录 POST 正文(请求和响应)
- python - Python pip 安装
- python - 如何使用 Tkinter asktosavefile 模块保存 pandasProfile 报告?
- python - 如何在 JupyterLab 上指定笔记本字体
- azure - Azure QnA Maker [下载知识库] 删除“changeStatus”?
- excel - 过滤表格内的单元格值
- javascript - Javascript:从对象数组中获取对象的子集
- git - git找不到要推送到的存储库
- tailwind-css - 为什么顺风中没有多少百分比单位?
- plotly - 有没有办法为绘图图设置动态宽度和高度?