我开发了一个自定义目标,如果编译(csc),则需要运行 (否则构建过程需要太长时间)。
我发现Inputs
和Outputs
属性可用于比较文件时间戳,并在Inputs
集合中有较新文件时执行目标。问题是我的目标没有产生任何文件,所以我不确定我应该传递什么作为Outputs
属性才能使这个工作正确(我不能使用目标程序集来检查它,因为编译时执行,程序集的时间戳是实际时间,因此我的目标将不会执行)。
任何想法我怎样才能做到这一点?
答案 0 :(得分:1)
您可以写出一个虚拟文件并将其用于输出。使用目标中的WriteLinesToFile任务输出名为“MyTarget.output”的文件。
MsBuild将使用该文件的时间戳来跟踪目标上次运行的时间,然后可以判断输入文件是否比输出文件更新并知道再次运行目标。
答案 1 :(得分:0)
一种可能的解决方案是使用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>