.net - 仅在实际构建项目时运行 MSBuild 目标

标签 .net build msbuild build-process msbuild-4.0

我有一个构建 */.sln 文件的 MSBuild 文件(构建所有存在的 .sln 文件)。

构建使用构建目标,因此如果未对输入文件进行任何更改,则不应再次构建任何项目。

我想执行一些自定义目标 仅当 一个项目实际上又被构建了。

如何才能做到这一点?

两者 AfterBuild 编译后总是被调用,无论编译/构建是否实际发生。

最佳答案

基本上你想要与 PostBuildEvent 相同的行为例如,我查了一下 Microsoft.Common.Targets这样做(这个文件总是提供一个很好的洞察力,了解应该如何使用 msbuild)。这是解决方案:

<PropertyGroup>
  <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
</PropertyGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="RunWhenBuild" AfterTargets="CoreBuild"       
        Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'">
  <Message Importance="high" Text="RunWhenBuild!!"/>
</Target>

这就是发生的事情:当有一个名为 RunPostBuildEvent 的属性时值为 OnOutputUpdated CoreBuild target 的依赖最终会记录构建前后输出文件的时间戳。如果它们相等,则不会生成输出。所以剩下的就是让你的目标在 CoreBuild 之后运行并检查这些时间戳。

关于.net - 仅在实际构建项目时运行 MSBuild 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13972820/

相关文章:

performance - MongoDB大索引构建很慢

c# - 不断地计算 const 值落后于一个构建

Delphi 2009 在 RAD Studio 命令提示符 F1026 中使用 MSBuild 未找到文件

.net - Facebook Graph API - 无法搜索 HashTag

c# - 过时的意思

java - 想要在2个不同的jdk中构建2个应用程序,然后在2个Tomcat服务器中运行

visual-studio - 为 COM 互操作注册 x64 程序集

msbuild - TFS 2010 构建错误 - 未找到导入的项目 "project_path"

c# - 无法连接到远程服务器,但可以在 fiddler 运行 Metro 应用程序时使用

.Net 3.5,在进程之间传递字符串的最安全方式