我有一个调用外部生成器的 msbuild 目标,即使包含此目标的项目未修改,也必须始终在解决方案重建时执行。
我试过追加,$(BuildDependsOn)
但只有在项目被修改时才会执行。
本质上,我必须扩展 msbuild 用来检查项目是否被修改以插入我自己的检查的机制。
我有一个调用外部生成器的 msbuild 目标,即使包含此目标的项目未修改,也必须始终在解决方案重建时执行。
我试过追加,$(BuildDependsOn)
但只有在项目被修改时才会执行。
本质上,我必须扩展 msbuild 用来检查项目是否被修改以插入我自己的检查的机制。
我猜你试过这样做:
<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.
但是通过指定“假输出”(参见.fake
Target 的 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>