Как заставить net -основные проекты включать автоматически сгенерированный файл кода? - PullRequest
0 голосов
/ 14 января 2020

У меня есть файл основного проекта. net (* .csproj), подобный следующему:

<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
  <!-- Create RS.cs -->
  <ItemGroup>
    <ResourceGeneratorInputs Include="strings.resx" />
    <ResourceGeneratorOutputs Include="RS.cs" />
  </ItemGroup>
  <Target Name="GenerateTheResourceFile" 
        BeforeTargets="PrepareForBuild" 
        Inputs="@(ResourceGeneratorInputs)" 
        Outputs="@(ResourceGeneratorOutputs)">
    <Exec Command="ResourceStringGenerator.exe strings.resx RS.cs " />
  </Target>
</Project>

У этих проектов есть цель, которая генерирует файл кода csharp с именем RS.cs, который также должен быть скомпилировано.

Проблема в том, что файл создан слишком поздно. Механизм сборки уже прочитал список файлов в каталоге проекта, а файл RS.cs игнорируется.

Я попытался изменить атрибут BeforeTargets для других целей, но безуспешно. (Описано здесь: https://docs.microsoft.com/en-us/dotnet/core/tools/csproj#build -events ) Я также пытался отключить автоматическое c включение файлов:

 <PropertyGroup>
    <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
  </PropertyGroup>

и создание собственного списка файлов для компиляции. Но это тоже не сработало. Файл RS.cs был сгенерирован слишком поздно.

Новый формат файла проекта, похоже, так жаждет получить список файлов, что, похоже, не остается места для автоматически сгенерированных файлов.

Какой обходной путь здесь?

1 Ответ

1 голос
/ 14 января 2020

Stati c часть файла проекта всегда оценивается перед выполнением целей. Тем не менее, вы также можете добавлять элементы внутри вашей цели:

<Target Name="GenerateTheResourceFile" 
      BeforeTargets="PrepareForBuild" 
      Inputs="@(ResourceGeneratorInputs)" 
      Outputs="@(ResourceGeneratorOutputs)">
  <Exec Command="ResourceStringGenerator.exe strings.resx RS.cs " />

  <ItemGroup>
    <EmbeddedResource Include="strings.resx" Exclude="@(EmbeddedResource)" />
    <Compile Include="RS.cs" Exclude="@(Compile)" />
  </ItemGroup>
</Target>

Часть «исключить» гарантирует, что файл не будет добавлен дважды, если он уже был получен во время оценки stati c (т.е. дополнительные сборки )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...