5

我想简化跨多个项目和团队的代码分析和相关规则。

我们过去通过使用 NuGet 包将分析器导入项目(Microsoft.CodeAnalysis.FxCopAnalyzers 和 StyleCop.Analyzers)并定义一个规则集来定义 VS 如何处理每个规则(错误、警告等)来做到这一点。

我一直在尝试使用通用的 .editorconfig 文件而不是规则集来设置它。问题是,当从共享文件夹导入 .editorconfig 文件时,似乎会忽略如下设置。

dotnet_diagnostic.CA1062.severity = error

为了对此进行测试,我有一个非常简单的场景来说明问题。

.editorconfig 文件如下:

[*.cs]
dotnet_diagnostic.CA1062.severity = error
#dotnet_code_quality.null_check_validation_methods = NotNull

现在这个文件被导入到一个 csproj 中,如下所示:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <Import Project="..\..\_Shared\Build.props" />
    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.4">
            <PrivateAssets>All</PrivateAssets>
        </PackageReference>
    </ItemGroup>
</Project>

Build.props 是这样的:

<Project>
    <PropertyGroup>
    <SkipDefaultEditorConfigAsAdditionalFile>true</SkipDefaultEditorConfigAsAdditionalFile>
    </PropertyGroup>
    <ItemGroup Condition="Exists('$(MSBuildThisFileDirectory)\.editorconfig')" >
        <AdditionalFiles Include="$(MSBuildThisFileDirectory)\.editorconfig" />
    </ItemGroup>
</Project>

以下代码应该在 CA1062 上触发错误:

public int Calculate(InputData input)
{
    SmartGuard.NotNull(nameof(input), input);
    if (this.Multiply)
    {
        return input.Value * 2;
    }
    else
    {
        return input.Value + 2;
    }
}

但结果是一个警告:

错误列表

现在,如果我更改 .editorconfig 并取消注释第二行:

[*.cs]
dotnet_diagnostic.CA1062.severity = error
dotnet_code_quality.null_check_validation_methods = NotNull

错误发生了,这意味着null_check_validation_methods正在考虑中。

为什么会dotnet_diagnostic.CA1062.severity = error被忽略?

4

3 回答 3

1

以下问题报告了 .editorconfig 机制的这个问题和其他问题:

这些问题已得到解决,并通过实施这些问题中引用的建议来回答原始问题。

于 2020-10-02T17:59:21.550 回答
0

您遇到的问题来自这样一个事实,即“.editorconfig”文件机制(不是由 Visual Studio 或 Microsoft 定义的——它是预先存在的标准)基于文件在文件夹结构中的位置。它与 Visual Studio 项目的机制无关。

请参阅此处有关 Microsoft 的提及:

当您将 .editorconfig 文件添加到文件层次结构中的文件夹时,其设置将应用于该级别及以下级别的所有适用文件。您还可以覆盖特定项目、代码库或代码库一部分的 EditorConfig 设置,以便它使用与代码库其他部分不同的约定。当您从其他地方合并代码并且不想更改其约定时,这可能很有用。

要覆盖部分或全部 EditorConfig 设置,请在您希望应用这些覆盖设置的文件层次结构级别添加一个 .editorconfig 文件。新的 EditorConfig 文件设置适用于同一级别的文件和任何子目录。

[这里的层次图]

如果您想覆盖部分但不是全部设置,请在 .editorconfig 文件中仅指定这些设置。仅覆盖您在较低级别文件中明确列出的那些属性。更高级别的 .editorconfig 文件中的其他设置将继续应用。如果要确保没有任何更高级别的 .editorconfig 文件的设置应用于代码库的这一部分,请将 root=true 属性添加到较低级别的 .editorconfig 文件:

# top-most EditorConfig file
root = true

EditorConfig 文件从上到下阅读。如果有多个具有相同名称的属性,则最近找到的具有该名称的属性优先。

或者这里是 EditorConfig 项目。

或者这里是 EditorConfig 规范:

文件处理

当为 EditorConfig 提供文件名时,将在给定文件的目录和所有父目录中执行 EditorConfig 文件(默认命名为“.editorconfig”)的搜索。不存在的目录被视为存在并且为空。搜索所有找到的 EditorConfig 文件以查找节名与给定文件名匹配的节。如果找到一个 EditorConfig 文件,并且在序言中将根键设置为 true 或到达根文件系统目录时,搜索将停止。

文件从上到下读取,找到的最新规则优先。如果多个 EditorConfig 文件具有匹配的部分,则最后读取较近的 EditorConfig 文件中的规则,因此较近的文件中的对优先。

于 2020-09-29T17:29:04.673 回答
0

我使用 Visual Studio 版本 16.11.2,我的经验是,当您在 Visual Studio 中编辑项目文件后,您所描述的问题作为一个错误出现,您已将指向它的链接添加到它作为解决方案项。在这样的操作之后 StyleCop 不再监听项目的 .editorconfig 文件。

要将 StyleCop 错误重新触发为构建错误,我必须:

  1. 删除项目的 .editorconfig 链接。
  2. 将 .editorconfig 的副本添加到项目中。
  3. 将 .editorconfig 的副本删除到项目中。
  4. 重新添加指向 .editorconfig 的链接。

是的,是的,但上述确实会触发错误再次显示为构建错误。

此外,在上述 Visual Studio 版本中,我需要在 .csproj 文件中包含以下行:

<PropertyGroup>       
   <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>

对于以前版本的 Visual Studio,我必须改为使用以下行:

<PropertyGroup>       
  <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  <WarningsAsErrors></WarningsAsErrors>
</PropertyGroup>
于 2021-08-27T07:58:51.270 回答