我开发了一个自定义目标,只有在编译(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>