在构建过程之后始终执行自定义的MSBuild任务

3
我创建了一个自定义任务,该任务在构建操作之后执行。
<Target Name="AfterBuild" />
<Target Name="MyTarget"
        AfterTargets="AfterBuild">
  <MyTask ... />
</Target>

问题: 如果构建操作由于项目没有更改/不需要再次构建而未执行,是否有可能执行任务?

换句话说:我希望在构建过程的最后始终执行该任务,即使未再次构建项目。

更新: 使用AfterTargets="Build" 或设置属性<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>都没有帮助。

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


你是如何触发第二次构建过程的?只需在Visual Studio中点击“Build”吗? - Leo Liu
@Leo-MSFT 是的,完全正确。 - Christian St.
2个回答

6
如果构建操作由于项目中没有更改或者不需要重新构建而未执行,是否可以执行该任务?
如果我理解正确的话,您可以在项目文件中定义此属性:
<PropertyGroup> 
  <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck> 
</PropertyGroup>

注意:这种方法似乎绕过了MSBuild的正常更新检查,使用一种更快捷但有副作用的自定义检查,会破坏定制化的构建目标。
更新: 不确定为什么这种方法在您的项目上不起作用,让我详细解释一下:
1. 在您的项目文件中定义该属性。 2. 添加自定义的MSBuild任务,并附带一些消息信息。 3. 构建项目,检查输出(日志文件详细度为Normal)。 4. 再次构建项目,再次检查输出。

MSBuild命令行不是一个选项。定义属性也没有帮助。 - Christian St.
@ChristianSt.,谢谢你的回复。我在我的机器上测试了一下,它运行得很好。不确定为什么它对你的项目不起作用。你可以尝试创建一个新的空白项目,并按照我的步骤验证这个问题,看看是否正常工作。如果还是不行,请告诉我们项目类型和其他信息,或者给我们提供一个样本,以便我们能够重现这个问题。 - Leo Liu
啊啊啊,对不起...设置属性就是解决办法。我的错误在于我没有直接在项目文件中设置属性。相反,我将其设置在了多个项目之间共享的项目文件中(导入....)。现在它可以正常工作了。谢谢 :-) - Christian St.

0
如果我使用AfterTargets="Build"而不是AfterBuild,每次构建解决方案(.NET Core控制台应用程序与.NET标准类库)时,消息都会写入输出窗口。
  <Target Name="MyAfterBuild" AfterTargets="Build">
    <Message Importance="High" Text="Hello World!" />
  </Target>

1
无法重现这个问题。我只得到了与之前相同的输出 构建:0 成功,0 失败,1 最新,0 跳过 - Christian St.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接