#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 только для того, чтобы я мог их использовать. Я смог найти решение, которое работает идеально:
- В проекте, который будет анализироваться, добавьте ссылку на проект, содержащий анализаторы.
- Отредактируйте файл проекта, найдите только что созданный вами тег 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 — единственные варианты. Это будет немного громоздко, но я могу заставить это работать.