gpt4 book ai didi

c++ - 如何使自定义 MSBuild 目标的执行依赖于文件的时间戳?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:50 27 4
gpt4 key购买 nike

我正在处理的 C++ 项目(我将其从 VS2008 转换为 VS2010)过去使用多个 vcbuild .rules 文件来指定自定义构建规则。这些 .rules 文件对于 CustomBuildRule 节点有一个特定的“AdditionalDependencies”属性,它指定了一个文件列表,在计算目标是否需要重建时应该考虑这些文件。这些“AdditionalDependencies”在 VS2010 转换期间被忠实地转移到相应的 .props 文件中。

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

MSDN documentation for the Target节点显示一个 Condition 属性,它应该可以很好地满足我的要求,但此属性支持的条件似乎没有通过已经执行的“存在”测试。

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

最佳答案

请仔细查看目标 Output 属性:

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

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

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

有关使用 MSBuild 进行增量构建的原始文章和更多信息,请参见 here .

关于c++ - 如何使自定义 MSBuild 目标的执行依赖于文件的时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6147012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com