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

标签 c++ visual-studio-2010 msbuild

我正在处理的 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/

相关文章:

c++ - C++ 中对 Fortran 函数的 undefined reference

C++ DLL 不导出我的函数

.net - 在 wpf 中,如何使用标准对话框来选择目录

c++ - 如何在 Visual C++ 2010 中从 C++0x 启用 nullptr?

azure - MSBuild 现在无法解析引用

c++ - 使用内联的显式模板函数实例化

c++ - 访问全局 vector 时出现 "Access violation reading location"

c# - 从 C# 调用 C++ dll 时如何获取 std::exception 错误描述

c# - 向项目添加 Postbuild 事件

c# - dotnet publish profile CLI 与 Visual Studio 的行为不同