仅在编译时运行自定义目标

时间:2012-04-04 07:25:21

标签: c# msbuild

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

一种可能的解决方案是使用PostBuildEvent。 为了实现这一目标,我们需要做到以下几点:

  1. 将值设置为<PostBuildEvent>。这可以直接在<PropertyGroup>内完成,例如:<PostBuildEvent>echo Post build event completed</PostBuildEvent>。我只使用echo将消息写入输出,因为<PostBuildEvent>不能为空。
  2. 将属性<PostBuildEvent>设置为OnOutputUpdated。这会导致MSBuild比较编译之前和之后的程序集时间戳,并仅在程序集发生更改时才执行<PostBuildEvent>
  3. <PostBuildEventDependsOn>
  4. 中设置要执行的依赖项/目标

    完整示例如下所示:

    <PropertyGroup>
        <PostBuildEvent>echo Post build event completed</PostBuildEvent>
        <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
        <PostBuildEventDependsOn>$(PostBuildEventDependsOn);MyCustomTarget</PostBuildEventDependsOn>
    </PropertyGroup>