如何制作自定义MSBuild目标's的执行依赖于文件's的时间戳

How can I make a custom MSBuild Target's execution dependent on a file's time stamp?

本文关键字:依赖于 文件 时间戳 执行 何制作 MSBuild 自定义 目标      更新时间:2023-10-16

我正在处理的C++项目(我将其从VS2008转换为VS2010)曾经使用几个vcbuild.rules文件来指定自定义生成规则。这些.rules文件具有CustomBuildRule节点的特定"AdditionalDependencies"属性,该属性指定了在确定目标是否需要重建时应考虑的文件列表。在VS2010转换期间,这些"AdditionalDependencies"被忠实地转移到相应的.props文件中。

与自定义生成规则关联的.targets文件确实将这些AdditionalDependencies添加到Target节点的Inputs属性中。这样可以确保在依赖项中列出的任何文件不存在的情况下执行目标,但如果其中一个依赖项比目标的输出更新,则不会执行目标。它在逻辑上也不太正确,因为并非所有文件都是实际输入,其中一些文件引用了可能在目标构建过程中使用的可执行文件。因此,它们可能会被检查到版本控制中并将存在,但文件的较新版本需要触发受影响目标的重建。

Target节点的MSDN文档显示了一个Condition属性,它应该可以满足我的需求,但该属性支持的条件似乎没有通过已经执行的"Exists"测试。

我是否可以使用一个条件来比较两个文件的时间戳(或者理想情况下,AdditionalDependencies中当前列出的文件的时间印记与目标的输出文件),从而允许我触发类似"如果这些依赖项过期,则重建此目标"的make?

请仔细查看目标Output属性:

"MSBuild可以将输入文件的时间戳与输出文件的时间标记进行比较,并确定是跳过、生成还是部分重新生成目标。在以下示例中,如果@(CSFile)项列表中的任何文件比hello.exe文件新,MSBuild将运行目标;否则将跳过:"

<Target Name="Build" 
    Inputs="@(CSFile)" 
    Outputs="hello.exe">
    <Csc
        Sources="@(CSFile)" 
        OutputAssembly="hello.exe"/>
</Target>

可以在此处找到原始文章以及有关MSBuild增量生成的更多信息。