Настройка сборки для обработки созданных файлов

В любой сборке файлы, созданные во время сборки, ведут себя не так, как статические файлы (например, исходные файлы). По этой причине важно понимать, как MSBuild создает проекты. Эти два этапа называются этапом оценки и этапом выполнения. На этапе оценки MSBuild считывает проект, импортирует все, создает свойства, расширяет маски элементов и настраивает процесс сборки. На этапе выполнения MSBuild выполняет сборку, выполняя целевые объекты и задачи с данными, проанализированными на этапе оценки.

Файлы, созданные во время выполнения, не существуют на этапе оценки, поэтому они не включаются в процесс сборки. Чтобы решить эту проблему, необходимо вручную добавить созданные файлы в процесс сборки. Для этого рекомендуется добавить новый файл в элементы Content или None до целевого объекта BeforeBuild, как показано в следующем примере:

<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 (среди прочих), прежде чем они будут преобразованы в новые элементы. См. общие типы элементов.