【问题标题】:How can I have an msbuild target run only if new compilation actually occurred?仅当实际发生新编译时,如何才能运行 msbuild 目标?
【发布时间】:2024-01-21 02:19:01
【问题描述】:

我正在尝试让 MSBuild 生成一个带有版本号的文本文件,该版本号表示构建的创建时间。

现在在我的 MSBuild 任务中,我有以下内容:

  <Target Name="WriteBuildDate" AfterTargets="Compile">
    <WriteLinesToFile File="buildversion.txt" Lines="$([System.DateTime]::UtcNow.Year).$([System.DateTime]::UtcNow.Month).$([System.DateTime]::UtcNow.Day).$([System.Math]::Floor($([System.DateTime]::UtcNow.Subtract($([System.DateTime]::UtcNow.Date)).TotalSeconds)))" Overwrite="true" Encoding="Unicode" />
  </Target>

这可行,但即使未重建所有程序集也会执行。这意味着,如果我对多台服务器使用 VS 发布功能,它们中的每台服务器的版本号都会略有不同,即使构建都相同。

是否有任何方法(没有自定义 msbuild 任务)仅在至少重建一个程序集时才执行此目标?

【问题讨论】:

  • 查看*.com/questions/22542820/…*.com/questions/13972820/… 或明确指定依赖项,如&lt;Target Name="WriteBuildDate" AfterTargets="CopyFilesToOutputDirectory" Inputs="@(ReferencePath)" Outputs="buildversion.txt"&gt;(如果主可执行文件发生更改,则不会更新版本 - 不确定我是否从您的问题中理解正确?如果不是, 将 $(TargetPath) 添加到 Inputs)

标签: msbuild


【解决方案1】:

感谢@stijn 的评论/链接,我能够通过以下方式完成这项工作:

  <PropertyGroup>
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
  </PropertyGroup>

  <Target Name="WriteBuildDate" AfterTargets="CoreBuild" Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'">
    <WriteLinesToFile File="buildversion.txt" Lines="$([System.DateTime]::UtcNow.Year).$([System.DateTime]::UtcNow.Month).$([System.DateTime]::UtcNow.Day).$([System.Math]::Floor($([System.DateTime]::UtcNow.Subtract($([System.DateTime]::UtcNow.Date)).TotalSeconds)))" Overwrite="true" Encoding="Unicode" />
  </Target>

【讨论】:

    最近更新 更多