我的最终目标是可以将fbx格式的3D场景添加到我的解决方案中,并在构建我的解决方案时自动将它们转换为sdkmesh文件和dds纹理。
为此,我创建了一个自定义构建目标,该目标在解决方案中的fbx文件上调用程序ContentExporter.exe,该目标实现从fbx到sdkmesh和dds的转换。
通过使用增量构建,我希望Visual Studio在我的fbx文件上自动重新运行ContentExporter.exe,但仅在输出过期时。例如,如果我修改了fbx文件,它应该重建,并且当其中一个输出丢失时它应该重建。
我使用XamlTaskFactory实现了自定义构建任务。此自定义任务调用以下命令行:
"$(MSBuildBinPath)\amd64\Tracker.exe" /d "$(MSBuildBinPath)\FileTracker64.dll" /i $(TLogLocation) /r "[Inputs]" /c ContentExporter.exe [AllOptions] [Inputs]
此命令行在MSBuild的文件跟踪器下运行ContentExporter.exe。结果,它在我的中间构建目录中输出两个文件:
这些文件包含编译期间文件之间的读/写依赖关系列表。例如,ContentExporter.read.1.tlog包含(我的计算机上的路径替换为path\to\my\project
):
^C:\path\to\my\project\ASSETS\CUBE\CUBE.FBX
C:\path\to\my\project\ASSETS\CUBE\CUBE.FBX
C:\path\to\my\project\ASSETS\CUBE\CUBE.FBM\DEFAULT.PNG
C:\path\to\my\project\BUILD\DEFAULT.DDS
如果我理解正确,这意味着文件跟踪器发现在cube.fbx上运行ContentExporter.exe会导致ContentExporter.exe读取cube.fbx,default.png和default.dds。
此外,ContentExporter.write.1.tlog包括:
^C:\path\to\my\project\ASSETS\CUBE\CUBE.FBX
C:\path\to\my\project\ASSETS\CUBE\CUBE.FBM\DEFAULT.PNG
C:\path\to\my\project\BUILD\CUBE.SDKMESH
C:\path\to\my\project\BUILD\DEFAULT.DDS
如果我理解正确,这意味着文件跟踪器发现在cube.fbx上运行ContentExporter.exe导致ContentExporter.exe写入default.png,cube.sdkmesh和default.dds。
使用这些跟踪器日志,我希望Visual Studio的增量构建系统能够处理我的资产。例如:
事实上,在我当前的设置中,如果我删除default.dds(在我的构建输出目录中),则Visual Studio会自动注意到下次构建解决方案时需要重建cube.fbx。如果我更新cube.fbx或default.png的时间戳,它还会重建cube.fbx,所以看起来跟踪工作正常。
但是,我注意到即使我修改了一个完全不相关的文件,比如在我的项目中修改任何C ++源文件,它仍然会重建cube.fbx。
我还尝试明确设置我的任务的输入和输出属性(例如:to" cube.fbx"和" cube.sdkmesh")。当我删除cube.sdkmesh时,这适用于重建sdkmesh,但是当我删除default.dds时,它不会重建default.dds。我想我需要一种方法来了解tlog文件中的输入和输出,但我认为这会自动完成?
导致此错误的原因是什么?我不理解这个过程的一部分吗?
我的项目还有一些额外的细节:https://github.com/nlguillemot/ContentExporterMSBuild/issues/1
答案 0 :(得分:0)
我们无法让MSBuild正确读取跟踪器生成的tlog文件。根据{{3}}:
目标元素可以同时具有Inputs属性,表示 什么项目目标>期望作为输入和输出属性, 这表示它产生的项目是MSBuild尝试的输出 找到这些属性值之间的1对1映射。如果一个 存在1对1映射,MSBuild比较每个输入的时间戳 item到其相应输出项的时间戳。输出文件 将没有1对1映射的数据与所有输入文件进行比较。一个物品 如果输出文件的年龄相同或更旧,则认为是最新的 而不是其输入文件。
如果所有输出项都是最新的,MSBuild会跳过目标。这个 目标的增量构建可以显着改善构建 速度。如果只有一些文件是最新的,MSBuild将执行目标 但跳过最新的项目,从而带来所有项目 最新。这称为部分增量构建。
当您更改项目中的任何文件时,您会观察到以下输出。
Test.cpp将被编译为$ {Toolpath} \ Test.cpp被修改为 2/16/2017 12:19:12 PM。
不一致的时间戳会触发重建,而不是跟踪器生成的tlog文件。因此,我们无法通过欺骗MSBuild来正确读取跟踪器生成的tlog文件来减少重建。