如何根据文件的时间戳创建自定义MSBuild Target的执行?

Tim*_*sch 5 c++ msbuild visual-studio-2010

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

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

目标节点的MSDN文档显示了一个Condition属性,该属性应该可以满足我的要求,但此属性支持的条件不会超出已经执行的"存在"测试.

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

Kim*_*mCM 3

请仔细查看目标Output房产:

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

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

    <Csc
        Sources="@(CSFile)" 
        OutputAssembly="hello.exe"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

可以在此处找到有关使用 MSBuild 进行增量构建的原始文章和更多信息。

  • 也许输入属性中的“生成器可执行文件的名称”并不代表文件的路径,因此 MSBuild 无法发现更改的时间戳。 (2认同)