自定义生成以处理生成的文件
在任何给定的生成中,在生成过程中生成的文件的行为与静态文件(例如源文件)不同。 因此,了解 MSBuild 如何生成项目非常重要。 这两个阶段是评估阶段和执行阶段。 在评估阶段,MSBuild 读取项目、导入所有内容、创建属性、扩展项的 glob,并设置生成过程。 在执行阶段,MSBuild 通过使用它在评估阶段分析的数据运行目标和任务来执行生成。
在执行期间生成的文件在评估阶段不复存在,因此它们不包括在生成过程中。 若要解决此问题,必须手动将生成的文件添加到生成过程中。 推荐的方法是将新文件添加到 BeforeBuild
目标之前的 Content
或 None
项,如下例所示:
<Target Name="MyTarget" BeforeTargets="BeforeBuild">
<!-- Some logic that generates your file goes here -->
<!-- Generated files should be placed in $(IntermediateOutputPath) -->
<ItemGroup>
<!-- If your generated file was placed in `obj\` -->
<None Include="$(IntermediateOutputPath)my-generated-file.xyz" CopyToOutputDirectory="PreserveNewest"/>
<!-- If you know exactly where that file is going to be, you can hard code the path. -->
<None Include="some\specific\path\my-generated-file.xyz" CopyToOutputDirectory="PreserveNewest"/>
<!-- If you want to capture "all files of a certain type", you can glob like so. -->
<None Include="some\specific\path\*.xyz" CopyToOutputDirectory="PreserveNewest"/>
<None Include="some\specific\path\*.*" CopyToOutputDirectory="PreserveNewest"/>
</ItemGroup>
</Target>
将生成的文件添加到 None
或 Content
就足以让生成过程看到它。 你还希望确保在正确的时间添加它。 理想情况下,目标在 BeforeBuild
之前运行。 AssignTargetPaths
是另一个可能的目标,因为它是在 None
和 Content
项(以及其他项)转换为新项之前修改它们的最后机会。 请参阅常见项类型。