Правильный способ использования MSBuild Task, который генерирует код с Intellisense - PullRequest
0 голосов
/ 01 ноября 2018

Контекст

В некоторых проектах мы пытались выполнить генерацию кода непосредственно из Visual Studio. Основная идея заключается в том, что вы можете создать группу (.foo) файлов, и каждый (.foo) файл соответствует одному сгенерированному (.foo.cs) файлу.

В основном процесс работает следующим образом:

  1. Во время сборки собираются все файлы .foo.
  2. Некоторые преобразования происходят. Обратите внимание, что для некоторых преобразований требуется информация из всех файлов .foo.
  3. Для каждого файла .foo создается файл .foo.cs с частичным классом.

Обычно я бы создал для этого один генератор файлов (пользовательский инструмент) - однако в этом случае я хотел бы знать, что имя файла всегда .foo.cs, и, похоже, нет способа может управляться из одного генератора файлов. Кроме того, тот факт, что для сборки требуется информация из нескольких файлов, заставил меня выбрать альтернативный подход.

Поэтому я создал задачу сборки MS и зарегистрировал ее в csproj:

<UsingTask AssemblyFile="C:\Projects\FooTool\bin\Debug\FooBuildTool.dll"
           TaskName="FooBuildTool.FooTool" />
<Target Name="Foo" BeforeTargets="BeforeBuild" 
        Condition="'$(MSBuildProjectExtension)' == '.csproj'">
    <FooTool Language="C#" ProjectFolder="$(ProjectDir)" 
             ProjectName="$(ProjectName)" Sources="@(Foo)">
        <Output ItemName="FooCompile" TaskParameter="ComputedSources" />
    </FooTool>
    <ItemGroup>
        <Compile Include="@(FooCompile->'%(Outputs)')" />
    </ItemGroup>
</Target>

Это прекрасно работает в том смысле, что работает генерация кода и генерирует все необходимые .cs файлы.

Обратите внимание, что если Intellisense не работает, пока я не нажму 'build' - это нормально.

Положение

Проблема в том, что Intellisense не работает для файлов .foo.cs, и я ищу способ исправить это.

Я попытался исправить это, изменив файл .csproj еще больше:

<Compile Include="Test.foo.cs">
  <AutoGen>True</AutoGen>
  <DesignTime>True</DesignTime>
  <DependentUpon>Test.foo</DependentUpon>
</Compile>

...

<Foo Include="Test.foo" Generator="Foo" LastGenOutput="Test.foo.cs" />

Кажется, это работает, в том смысле, что файлы теперь отображаются в обозревателе решений Visual Studio.

Однако я не знаю, как создать это автоматически, и не смог найти ни документации, ни примера об этом. Я предполагаю, что это связано с созданием правильного VSTemplate?

Вопрос

Как правильно решить эту проблему? Например. Как я могу убедиться, что сгенерированные файлы отображаются в Visual Studio, чтобы Intellisense мог их забрать?

...