在VS2022中,您可以设置一个解决方案范围的editorconfig,以及覆盖它的项目特定的editorconfig吗?

6
在Visual Studio 2022中,您是否可以设置一个解决方案范围的.editorconfig文件,然后再设置项目特定的.editorconfig文件,以覆盖或添加到解决方案范围的文件中?
在我的情况下,我希望为单元测试项目设置不同的设置,并且/或者在旧项目上禁用旧方法警告。
Visual Studio 2022支持这个吗?

编辑:另外需要说明的是,我熟悉MS文档中的.editorconfig文件夹层次结构。

文档中的方法在我的实际项目或特意创建的演示项目上都无法正常工作。它已在VS2022 17.4.3和预览版17.5上进行了测试。通过经验,您将会发现文档和功能并不总是一致的。;)

2个回答

4

是的,.editorconfig 文件的设置是分层的,子文件夹中的设置会添加或覆盖父文件夹中的设置。

甚至可以通过在子文件夹中包含 root = true 来停止从某个级别开始的继承。

来自文档

当您将 .editorconfig 文件添加到文件层次结构中的文件夹中时,其设置适用于该级别及以下所有适用的文件。

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

如果您想覆盖某些设置,但不是全部设置,请在 .editorconfig 文件中只指定这些设置。只有在底层文件中明确列出的属性才会被覆盖。其他来自更高级别的 .editorconfig 文件中的设置仍然适用。
此类文件夹和文件层次结构可能如下所示。
\ YourSolution
  - YourSolution.sln
  - .editorconfig
    ...      
  \ Src      
    \ Project1
      ...    
    \ Project2    
      ...
    \ Project3
      - .editorconfig    
      ...            
  \ Tests      
    - .editorconfig        
    \ Tests1
      ...          
    \ Tests2
      - .editorconfig

根目录下的.editorconfig文件也可以放在所有Visual Studio解决方案的共同父文件夹中。

\ YourSolutions
  - .editorconfig
  \ YourSolution1
    - YourSolution1.sln  
    ...
  \ YourSolution2
    - YourSolution2.sln
    ...
    

示例文件。

根目录下的.editorconfig文件

[*.cs]
dotnet_sort_system_directives_first = true
dotnet_style_require_accessibility_modifiers = 
for_non_interface_members:error

子文件夹 .editorconfig 文件

[*.cs]
dotnet_sort_system_directives_first = false
dotnet_style_require_accessibility_modifiers = 
for_non_interface_members:silent

在VS2022 17.4.3+中,当处理多个.editorconfigs时,您可能需要使用标准文本编辑器而不是默认的.editorconfig gui工具。

1
你是自己完成的还是只是从可能不正确的文档中推断出来的?我在我的项目(和示例项目)中尝试过,但没有成功。文档也没有提到解决方案与项目的区别,而是使用了相当模糊的文件夹。 - Greg
仅作为旁注,在VS2022特定的文档中,它提到了一个“EditorConfig语言服务扩展”...但是该扩展在VS2022上无法工作。 - Greg
@Greg 我已经添加了我的 .editconfig 文件的示例摘录,你可以尝试一下。Visual Studio 2022 不需要任何额外的扩展程序。文档提到文件夹只是因为它不是解决方案或项目相关的。 - pfx
@Greg 很高兴听到这个好消息。我一直在思考还有什么其他原因,感谢你的反馈。 - pfx
你们中有人能使用这个解决方案的变体吗? - Paul Michalik
显示剩余6条评论

2

pfx的回答是使用.editorconfig文件的出色概述 - 如描述的那样,它们是基于目录的层次结构,因此优先级总是由属性定义接近文件的方式隐含(不能有两个具有相等优先级的.editorconfig文件)。

作为补充答案,因为您标记了C#,我还要提到.globalconfig文件。.editorconfig文件适用于目录的内容,而.globalconfig文件则用于基于项目(或作为NuGet包的一部分)应用分析器规则。例如,如果将文件从项目文件夹外链接到项目中,则不会将.editorconfig设置应用于该项目的文件,但将应用.globalconfig设置。

全局配置文件可以在每个项目中隐式或显式地继承,如果命名为除“.globalconfig”之外的其他名称,则可以按项目包含。请参见https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/configuration-files#naming。如果您的项目结构类似于以下内容,则可以使用此功能:

\ YourSolution
  - YourSolution.sln
  - .editorconfig
  - Directory.Build.props
    ...      
  \ Src      
    \ Feature1
      \src
        - Feature1.csproj
        ...
      \test
        - Feature1.Test.csproj
        ...
    \ Feature2
      \src
        - Feature2.csproj
        ...
      \test
        - Feature2.Test.csproj
        ...

在这种情况下,您可以在Directory.Build.props文件中定义一些内容,仅适用于测试项目,例如:
<PropertyGroup Condition="$(MSBuildProjectName.EndsWith('.Test'))">
  <GlobalAnalyzerConfigFiles Include="AnalyzerSettingsForTestProjects.globalconfig" />
</PropertyGroup>

全局配置文件可能会与彼此或适用于相同文件的.editorconfig文件发生冲突。全局配置文件可以指定一个global_level属性来指定它们的相对优先级。.editorconfig将优先于.globalconfig。有关冲突解决的规则,请参阅此处:https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/configuration-files#precedence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接