我有一个.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
上的Outputs
和Task
,然后它会在每次构建时生成文件。但是这一代很长,如果没有必要,我想避免它(模板文件没有改变)。如何在第一次构建时或必要时使构建自引导并生成文件?
答案 0 :(得分:2)
输出项目用于指示目标的已知输出文件。然后,MSBuild检查输出的所有修改日期是否大于输入项的最高修改日期,以查看它是否可以跳过目标。如果缺少其中一个输出,它也将运行目标。
如果您无法事先知道目标生成哪些文件,则解决方法是生成具有已知位置的临时文件。
e.g。 write使用WriteLinesToFile
任务(配置为覆盖)来更新文件($(IntermediateOutputPath)autogen.marker
)并将该文件用作输出元素。然后它将在第一个构建上运行目标,然后仅在输入模板文件比标记更新时运行。