我有一个游戏的多项目设置。有一个名为“resources”的非常具体的子项目,它只包含要打包到 jar 中的图像、声音和 texfiles 等文件。
我有一个自定义任务来处理图像并打包它们。在“src/main”中,我使用了一个文件夹“预处理”,图像应该放在其中,而“非托管”文件夹则放在其他所有文件夹中。通过运行我的任务,“preprocess”中的所有图像都被打包并输出到“resources”,“unmanaged”中的所有内容都按原样复制。
val texturePacker = TaskKey[Unit]("texture-packer", "Runs libgdx's Texture Packer")
val texturePackerTask = texturePacker := {
println("Packaging textures...")
val inputDir = file("resources/src/main/preprocess")
val outputDir = file("resources/src/main/resources")
val folders = inputDir.asFile.listFiles filter (_.isDirectory)
println("Sub-Folders:" + folders.mkString(", "))
// Run Texture Packer
for (subfolder <- folders) {
println("Building assets for:" + subfolder)
val args = Array(subfolder.toString, outputDir.toString, subfolder.getName)
com.badlogic.gdx.tools.imagepacker.TexturePacker2.main(args)
}
// Copy unmanaged resources
IO.copyDirectory(file("resources/src/main/unmanaged"), file("resources/src/main/resources"))
}
然后在“资源”项目的设置中:
...
packageBin in Compile <<= packageBin in Compile dependsOn(texturePacker)
...
其他子项目依赖于与其运行相关的 packageBin。这样,每当我运行项目时,我都会获得最新的资源状态。我不希望它按需提供。问题是每次运行都需要很长时间来处理。我知道 SBT 支持缓存SBT 常见问题解答,但我不明白如何使其适应我的任务。
如果文件夹列表中子文件夹中的文件未修改,如何使我的自定义任务避免重做工作?