1

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

我试过追加,$(BuildDependsOn)但只有在项目被修改时才会执行。

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

4

1 回答 1

1

我猜你试过这样做:

<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.

但是通过指定“假输出”(参见.fakeTarget 的 Outputs 属性),您可以强制 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>
于 2013-07-22T20:43:15.093 回答