Использовать анализатор кода Roslyn в том же решении

#c# #.net #.net-core #roslyn

#c# #.net #.net-ядро #roslyn

Вопрос:

У меня есть решение, состоящее из нескольких проектов .NET Core. У меня есть несколько задач по анализу кода, которые я хотел бы выполнить, которые применимы только к этому решению, поэтому нет смысла помещать их в отдельный репозиторий / решение. Используя соответствующий шаблон, я создал три проекта для анализаторов:

  • Пример.Анализатор
  • Пример.Analyzer.Test
  • Пример.Analyzer.Vsix

Пример.Analyzer.Vsix не компилируется, потому что для Visual Studio требуется .NET Framework, но я ориентируюсь на .NET Core для кроссплатформенного использования. На данный момент я игнорирую этот проект, но я намерен его удалить. Пример.Анализатор и пример.Анализатор.Протестируйте оба целевых netcoreapp3.0 вместе со всеми другими проектами в решении.

Я написал свои анализаторы, и тесты пройдены. Однако я не уверен, как на самом деле использовать эти анализаторы из других проектов. Я попытался добавить пример.Анализатор как зависимость через ProjectReference, но, похоже, это не включает анализаторы.

Ответ №1:

Буквально вчера я хотел создать набор анализаторов для продукта, над которым я работаю, и не имело смысла делать это в другом решении и размещать частный Nuget только для того, чтобы я мог их использовать. Я смог найти решение, которое работает идеально:

  1. В проекте, который будет анализироваться, добавьте ссылку на проект, содержащий анализаторы.
  2. Отредактируйте файл проекта, найдите только что созданный вами тег ProjectReference и добавьте свойства ReferenceOutputAssembly=false, OutputItemType=Analyzer. Это должно выглядеть примерно так:
 <ProjectReference Include="....analyzersAnalyzersProjectAnalyzersProject.csproj">
  <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  <OutputItemType>Analyzer</OutputItemType>
</ProjectReference>
  

Это все, что необходимо. Теперь, как только ваше решение будет построено, ваши новые анализаторы должны работать. Единственное предостережение заключается в том, что Visual Studio, похоже, кэширует анализаторы, поэтому, если вы измените его, вам может потребоваться закрыть и повторно открыть VS для работы новых / измененных анализаторов.

Как бы мне ни хотелось, я не могу полностью приписать это себе. Вчера я сам очень приблизился к этому решению, но сегодня утром я нашел сообщение в блоге, которое немного упростило ситуацию (именно оттуда я взял окончательное решение выше, в моем было еще несколько «ненужных» строк)

Одна вещь, которую я сделал в моем случае, это воспользовался «каталогом».Файл Build.props«в папке «мои проекты», чтобы добавить ссылку на этот проект. Таким образом, все проекты, созданные внутри этой папки, автоматически используют созданные мной анализаторы.

Комментарии:

1. Прежде всего, я люблю тебя. Это должно быть в официальных документах. Во-вторых, для всех, кто хочет объединить другие анализаторы со своими собственными и эффективно отразить функцию других анализаторов, на которые ссылаются, когда они являются зависимостями, а ваш собственный проект анализатора включен в пакет NuGet: установите <ReferenceOutputAssembly> значение true .

2. Мне кажется, или анализаторы, импортированные таким образом, не отображают волнистые линии (но они отображаются в виде предупреждений в сборке dotnet)?

3. можете ли вы подтвердить, работает ли это с командой сборки dotnet

Ответ №2:

Из того, что я нашел об этом, есть два способа добавить поддержку анализаторов в проект: через vsix или пакет nuget (как в примере здесь).

Установка этого пакета в качестве зависимости nuget показывает, что существует определенное свойство для определения типа содержимого зависимости:

<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>

Как вы можете видеть, одним из типов ресурсов являются анализаторы. К сожалению, кажется, что установка свойства «IncludeAssets» для зависимости проекта не поддерживается, даже если оно видно на панели свойств.

Я бы посоветовал вам попробовать nuget reference вместо project reference.

Чтобы извлечь пакет nuget из вашего проекта, просто щелкните его правой кнопкой мыши и выберите опубликовать. Кроме того, для размещения вашего нового nuget потребуется локальный исходный код репозитория nuget.

Комментарии:

1. Спасибо. Проведя довольно много исследований, я пришел к тому же выводу: VSIX и NuGet — единственные варианты. Это будет немного громоздко, но я могу заставить это работать.