2

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

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

4

2 回答 2

1

您可以写出一个虚拟文件并将其用于输出。使用目标中的 WriteLinesToFile 任务来输出名为“MyTarget.output”之类的文件。

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

于 2012-04-05T08:37:46.497 回答
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>
于 2012-04-05T08:32:06.100 回答