即使未修改项目,也始终在解决方案重建项目中执行目标

时间:2013-07-22 16:32:41

标签: visual-studio-2012 msbuild

我有一个调用外部生成器的msbuild目标,并且必须始终在解决方案重建时执行,即使未修改包含此目标的项目。

我已尝试附加到$(BuildDependsOn),但只有在项目被修改时才会执行。

基本上我必须扩展msbuild用来检查项目是否被修改以插入我自己的检查的机制。

1 个答案:

答案 0 :(得分:0)

我猜你试过这样做:

<Target Name="MyCustomBeforeBuild" BeforeTargets="BeforeBuild" Inputs="@(Compile)" Outputs="@(Compile->'%(RecursiveDir)%(Filename)%(Extension).generated')">
    <Message Text="MyCustomBeforeBuild Begin" Importance="High" />
    <Copy SourceFiles="@(Compile)" DestinationFiles="@(Compile->'%(RecursiveDir)%(Filename)%(Extension).generated')" />
    <Message Text="MyCustomBeforeBuild End" Importance="High" />
</Target>

在这种情况下,MSBuild将使用增量构建并根据输入和输出文件的时间戳比较评估没有文件被修改。

在这种情况下,您可以在详细或诊断日志消息中看到这样的

Skipping target "MyCustomBeforeBuild" because all output files are up-to-date with respect to the input files.

但是通过指定“假输出”(参见Target的Outputs属性中的.fake),您可以强制MSBuild每次都执行它(因为假文件不存在,不会发生时间戳比较,所以它总是被执行)

<Target Name="MyCustomBeforeBuild" BeforeTargets="BeforeBuild" Inputs="@(Compile)" Outputs="@(Compile->'%(RecursiveDir)%(Filename)%(Extension).generated.fake')">
    <Message Text="MyCustomBeforeBuild Begin" Importance="High" />
    <Copy SourceFiles="@(Compile)" DestinationFiles="@(Compile->'%(RecursiveDir)%(Filename)%(Extension).generated')" />
    <Message Text="MyCustomBeforeBuild End" Importance="High" />
</Target>