如何使用msbuild引导生成的文件任务输出

时间:2018-05-04 11:24:08

标签: visual-studio msbuild csproj

我有一个.csproj文件,我在其中声明了一些生成的文件:

<ItemGroup>
    <AutoGenerated Include="generated\*.cs;generated\Models\*.cs"/>
</ItemGroup>

这在任务中用作Outputs

<Target Name="GenerateFilesFromTemplate" BeforeTargets="BeforeBuild;BeforeRebuild"
        Inputs="sometemplatefile"
        Outputs="@(AutoGenerated)">
    <Exec
        Command="somegenerator.exe ... "
        Outputs="@(AutoGenerated)"/>
</Target>

generated/添加了.gitignore,因此生成的文件不属于源代码管理。

我的问题是这个设置不会自助启动。最初generated文件夹为空,构建会跳过生成文件任务,因为它没有输出:

GenerateFilesFromTemplate:
Skipping target "GenerateFilesFromTemplate" because it has no outputs.

我觉得我这样做的方式不对,或者我错过了明显的方法。我知道我可以移除Inputs上的OutputsTask,然后它会在每次构建时生成文件。但是这一代很长,如果没有必要,我想避免它(模板文件没有改变)。如何在第一次构建时或必要时使构建自引导并生成文件?

1 个答案:

答案 0 :(得分:2)

输出项目用于指示目标的已知输出文件。然后,MSBuild检查输出的所有修改日期是否大于输入项的最高修改日期,以查看它是否可以跳过目标。如果缺少其中一个输出,它也将运行目标。

如果您无法事先知道目标生成哪些文件,则解决方法是生成具有已知位置的临时文件。

e.g。 write使用WriteLinesToFile任务(配置为覆盖)来更新文件($(IntermediateOutputPath)autogen.marker)并将该文件用作输出元素。然后它将在第一个构建上运行目标,然后仅在输入模板文件比标记更新时运行。