2012-04-04 59 views
2

我开发了自定义目标,如果编译(csc)已完成(否则构建过程需要过长),则需要仅运行。 我发现InputsOutputs属性可用于比较文件时间戳,并在Inputs集合中存在较新文件时执行目标。问题是我的目标不生成任何文件,所以我不知道我应该通过什么作为Outputs属性来获得此工作正确性(我无法使用目标程序集来检查它,因为执行编译时的时间戳程序集是实际的时间,因此我的目标不会执行)。仅在编译时运行自定义目标

任何想法我怎么能做到这一点?

回答

0

一个可能的解决方案是使用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> 
1

您可以编写出一个虚拟文件,并利用它来进行输出。使用目标中的WriteLinesToFile任务输出一个名为“MyTarget.output”的文件。

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

+0

是的,这绝对是一种可能的方式,如何实现这一点。我试图避免创建虚拟输出文件,并找到一个更好的方法来做到这一点。但是,谢谢你的回答;) – 2012-04-05 08:47:19