【问题标题】:Execute custom MSBuild task always after build process始终在构建过程之后执行自定义 MSBuild 任务
【发布时间】:2017-11-22 15:57:40
【问题描述】:

我创建了一个在构建操作之后执行的自定义任务。

<Target Name="AfterBuild" />
<Target Name="MyTarget"
        AfterTargets="AfterBuild">
  <MyTask ... />
</Target>

问题:是否可以执行任务,如果构建操作被触发,但没有执行,因为项目没有变化/不需要再次构建?

换句话说:我想始终在构建过程结束时执行任务,即使项目没有再次构建。

更新:使用AfterTargets="Build" 或设置属性&lt;DisableFastUpToDateCheck&gt;true&lt;/DisableFastUpToDateCheck&gt;没有帮助。

第二次触发构建过程后,我只得到输出:Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped

【问题讨论】:

  • 您是如何再次触发构建过程的?只需在 Visual Studio 中单击构建?
  • @Leo-MSFT 是的,没错。

标签: visual-studio visual-studio-2015 msbuild msbuild-task


【解决方案1】:

是否可以执行任务,如果触发了构建操作,但没有执行,因为项目没有变化/不需要再次构建?

如果我理解正确,您可以在项目文件中定义此属性:

<PropertyGroup> 
  <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck> 
</PropertyGroup>

注意:此方法似乎是 Visual Studio 绕过了对 MSBuild 的常规最新检查,并使用了某种更快的自定义检查,但具有破坏自定义构建目标的副作用。

更新: 不知道这个方法对你的项目不起作用的原因,让我更详细地回答:

  1. 在项目文件中定义属性:
  2. 添加带有一些消息信息的自定义 MSBuild 任务。
  3. 构建项目,检查输出(日志文件详细程度为正常)。
  4. 再次构建项目,再次检查输出。

【讨论】:

  • MSBuild cmd 不是选项。定义属性没有帮助。
  • @ChristianSt.,感谢您的回复。我在我的机器上测试它,它工作正常。不确定它对您的项目不起作用的原因。您可以尝试创建一个新的空白项目并按照我的步骤验证此问题,检查它是否正常工作。如果没有,请与我们分享项目类型和其他信息,或将样本分享给我们,以便我们重现此问题。
  • Aaaahhh 抱歉...设置属性是解决方案。我的错是我没有直接在项目文件中设置属性。相反,我将它设置在一个项目文件中,该文件在多个项目之间共享(导入 ....))。它现在正在工作。谢谢:-)
【解决方案2】:

如果我使用 AfterTargets="Build" 而不是 AfterBuild,则每次构建解决方案(带有 .NET 标准类库的 .NET Core 控制台应用程序)时,都会将消息写入输出窗口。

  <Target Name="MyAfterBuild" AfterTargets="Build">
    <Message Importance="High" Text="Hello World!" />
  </Target>

【讨论】:

  • 无法重现。我只得到(和以前一样)输出Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多