Я создал небольшой библиотечный проект dotnetstandard 2.1
в решении. Я хочу проверить, используя Обнуляемые ссылочные типы . Как часть этого, я хочу иметь соответствующие ошибки компиляции и предупреждения.
TLDR; Я хочу знать, как правильно настроить параметры качества кода CA1062 в .editorconfig
.
Библиотечный проект
Я добавил следующие nuget
пакеты в проект:
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="2.9.8">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Ardalis.GuardClauses" Version="1.4.2" />
</ItemGroup>
Это включает в себя различные пакеты анализа кода, а также симпатичную библиотеку Стива Смита Guard Clauses .
Типы ссылок Nullable были включены с помощью <Nullable>enable</Nullable>
в проекте.
И у меня есть класс, который в реальном мире был бы хорошей реализацией, которая действительно что-то делала:
using System;
using MyGuards;
namespace EditorConfigIssues
{
public static class TestEditorConfig
{
public static void TestMethod(MyParam input)
{
string x = input.Check;
Console.WriteLine(x);
}
}
public class MyParam
{
public MyParam(string check) => Check = check;
public string Check { get; }
}
}
Guard Library Project
В решении, которое я добавил простая библиотека Guard, которая является еще одним dotnetstandard 2.1
проектом.
using System;
namespace MyGuards
{
public static class FakeGuard
{
public static void Validate(object obj)
{
if (obj == null)
throw new ArgumentNullException();
}
}
}
ПРИМЕЧАНИЕ. Это не конкурирует с библиотекой GuardClauses - просто используется для сравнения editorconfig с!
.editorconfig
Я добавил .editorconfig
к root решения со следующими проверками диагностики c:
dotnet_diagnostic.CA1062.severity = error
dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true
Итак, при компиляции я получаю следующее:
Так что все так, как я ожидаю. Я пока не использую охрану.
Исправление - Библиотека охраны Стива Смита
Итак, давайте попробуем реализовать пункты охраны из Библиотеки охраны Стива Смита, чтобы избавиться от ошибки.
Итак, мы добавляем следующее к TestEditorConfig.TestMethod
:
Guard.Against.Null(input, nameof(input));
и настраиваем .editorconfig
с помощью:
dotnet_code_quality.CA1062.null_check_validation_methods = Ardalis.GuardClauses.Guard.Against.Null
Отлично, все хорошо. Ошибка исчезла.
Исправление - моя собственная библиотека охраны
Но теперь я хочу использовать свою собственную охрану. Поэтому мы заменили начальную проверку защиты в TestEditorConfig.TestMethod
на:
FakeGuard.Validate(input);
и заменили null_check_validation_methods в .editorconfig
на:
dotnet_code_quality.CA1062.null_check_validation_methods = FakeGuard.Validate
Ошибка теперь вернулась.
Вопрос (ы)
- Вопрос в том, что мне нужно для использования проекта с охраной из того же решения?
- Почему я получаю предупреждения для другого CA1062 в окне ошибок?
The keyword "dotnet_code_quality.CA1062.exclude_extension_method_this_parameter" is unknown
The keyword "dotnet_code_quality.CA1062.null_check_validation_methods" is unknown
Я проверял эту ссылку MS Docs Code Quality и пытался различные комбинации для FakeGuard, в том числе:
- MyGuards
- MyGuards.FakeGuard
- FakeGuard
- MyGuards.FakeGuard.Validate
- FakeGuard.Validate
- Validate
Любопытно, что в другом решении я не получаю никаких жалоб на настройки CA1062 editorconfig в окне ошибок. И там я не смог заставить работать null_check_validation_methods
- следовательно, собирал это решение. Это беспокоило меня в течение месяца или двух, но, в конце концов, я получил энергию, чтобы собрать все вместе.
Ошибка EditorConfig?
Если я скопирую файл FakeGuard в проект библиотеки, тогда сообщение об ошибке исчезнет. Но почему это не работает в другом проекте в решении.