自定义生成以处理生成的文件

在任何给定的生成中,在生成过程中生成的文件的行为与静态文件(例如源文件)不同。 因此,了解 MSBuild 如何生成项目非常重要。 这两个阶段是评估阶段执行阶段。 在评估阶段,MSBuild 读取项目、导入所有内容、创建属性、扩展项的 glob,并设置生成过程。 在执行阶段,MSBuild 通过使用它在评估阶段分析的数据运行目标和任务来执行生成。

在执行期间生成的文件在评估阶段不复存在,因此它们不包括在生成过程中。 若要解决此问题,必须手动将生成的文件添加到生成过程中。 推荐的方法是将新文件添加到 BeforeBuild 目标之前的 ContentNone 项,如下例所示:

<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>

将生成的文件添加到 NoneContent 就足以让生成过程看到它。 你还希望确保在正确的时间添加它。 理想情况下,目标在 BeforeBuild 之前运行。 AssignTargetPaths 是另一个可能的目标,因为它是在 NoneContent 项(以及其他项)转换为新项之前修改它们的最后机会。 请参阅常见项类型