仅在进行编译时运行自定义目标
本文关键字:运行 自定义 目标 编译 | 更新日期: 2023-09-27 18:30:01
我已经开发了一个自定义目标,如果进行了编译(csc),它只需要运行(否则构建过程会花费太长时间)。我发现Inputs
和Outputs
属性可用于比较文件时间戳,并在Inputs
集合中有较新文件时执行目标。问题是我的目标不生成任何文件,所以我不确定我应该传递什么作为Outputs
属性才能正确工作(我不能使用目标程序集来检查,因为在执行编译时,程序集的时间戳是实际时间,因此我的目标不会执行)。
有什么想法我该如何做到这一点吗?
您可以写出一个伪文件并将其用于输出。在目标中使用WriteLinesToFile任务来输出一个名为"MyTarget.output"的文件。
MsBuild将使用该文件的时间戳来跟踪目标上次运行的时间,然后可以判断输入文件是否比输出文件新,并且知道是否要再次运行目标。
一种可能的解决方案是使用PostBuildEvent
。为了实现这一点,我们需要做以下工作:
- 将值设置为
<PostBuildEvent>
。这可以直接在<PropertyGroup>
中完成,例如:<PostBuildEvent>echo Post build event completed</PostBuildEvent>
。我只使用echo
向输出写入消息,因为<PostBuildEvent>
不能为空 - 将属性
<PostBuildEvent>
设置为OnOutputUpdated
。这将导致MSBuild比较编译前后的程序集时间戳,并仅在程序集发生更改时才执行<PostBuildEvent>
- 设置要在
<PostBuildEventDependsOn>
中执行的依赖项/目标
完整的示例如下:
<PropertyGroup>
<PostBuildEvent>echo Post build event completed</PostBuildEvent>
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
<PostBuildEventDependsOn>$(PostBuildEventDependsOn);MyCustomTarget</PostBuildEventDependsOn>
</PropertyGroup>