【问题标题】:Run an MSBuild target only if project is actually built仅在实际构建项目时运行 MSBuild 目标
【发布时间】:2012-12-08 00:16:30
【问题描述】:

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

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

我想执行一些自定义目标只有在项目实际上再次构建时。

如何做到这一点?

无论编译/构建是否实际发生,AfterBuildAfterCompile 都会被调用。

【问题讨论】:

  • 是每个项目文件中的目标,还是也属于解决方案的单独项目文件中?
  • 这似乎有点困难.. 另外,您希望在构建任何其他项目时构建目标,还是在构建所有项目时构建目标,或者...?
  • 在每一个之后。基本上我想将每个构建的输出(仅构建的输出)复制到某个文件夹,所以我只剩下实际构建的工件。

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


【解决方案1】:

例如,基本上你想要与 PostBuildEvent 相同的行为,所以我查看了 Microsoft.Common.Targets 是如何做到的(这个文件 always 很好地了解了 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 目标的依赖项最终将记录构建前后输出文件的时间戳。如果它们相等,则不会生成输出。所以剩下的就是让你的目标在CoreBuild 之后运行并检查这些时间戳。

【讨论】:

  • 是的,它是每个 csproj 文件末尾附近的标准(C# 必需)导入。没有它,您将无法(轻松)构建 C# 应用程序
  • 目标导入在最新(截至 2018 年)csproj 格式中是否仍然相关?即默认情况下从当前的csproj格式中删除它,我想在遵循这个时它可以继续被省略?
  • 对于那些发现这个并且正在使用新的 csproj 格式的人,请注意 this issue,这意味着如果您使用 &lt;PostBuildEvent&gt;...&lt;/PostBuildEvent&gt; 而不是这里提到的方法,您将无法使用 $(OutDir)等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多