仅在进行编译时运行自定义目标

本文关键字:运行 自定义 目标 编译 | 更新日期: 2023-09-27 18:30:01

我已经开发了一个自定义目标,如果进行了编译(csc),它只需要运行(否则构建过程会花费太长时间)。我发现InputsOutputs属性可用于比较文件时间戳,并在Inputs集合中有较新文件时执行目标。问题是我的目标不生成任何文件,所以我不确定我应该传递什么作为Outputs属性才能正确工作(我不能使用目标程序集来检查,因为在执行编译时,程序集的时间戳是实际时间,因此我的目标不会执行)。

有什么想法我该如何做到这一点吗?

仅在进行编译时运行自定义目标

您可以写出一个伪文件并将其用于输出。在目标中使用WriteLinesToFile任务来输出一个名为"MyTarget.output"的文件。

MsBuild将使用该文件的时间戳来跟踪目标上次运行的时间,然后可以判断输入文件是否比输出文件新,并且知道是否要再次运行目标。

一种可能的解决方案是使用PostBuildEvent。为了实现这一点,我们需要做以下工作:

  1. 将值设置为<PostBuildEvent>。这可以直接在<PropertyGroup>中完成,例如:<PostBuildEvent>echo Post build event completed</PostBuildEvent>。我只使用echo向输出写入消息,因为<PostBuildEvent>不能为空
  2. 将属性<PostBuildEvent>设置为OnOutputUpdated。这将导致MSBuild比较编译前后的程序集时间戳,并仅在程序集发生更改时才执行<PostBuildEvent>
  3. 设置要在<PostBuildEventDependsOn>中执行的依赖项/目标

完整的示例如下:

<PropertyGroup>
    <PostBuildEvent>echo Post build event completed</PostBuildEvent>
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
    <PostBuildEventDependsOn>$(PostBuildEventDependsOn);MyCustomTarget</PostBuildEventDependsOn>
</PropertyGroup>