在调试和发布配置之间指定单独的 .editorconfig 文件

Specify separate .editorconfig files between debug and release configurations

我正在使用 VS 2019 16.8.3,我想在解决方案 .editorconfig 文件中指定一些代码分析规则 (dotnet_diagnostic.CAXXXX.severity),仅用于发布版本。

当我在 .editorconfig 文件中添加规则时,调试构建时间会增加几分钟。项目属性中的所有分析器复选框均未选中“运行 on build”。

所以我想从代码分析中排除调试版本。是否可以仅为发布版本指定 .editorconfig 文件?

或者是否可以为构建禁用此 .editconfig 并仅申请手动代码分析?

由于您的配置条件,.editorconfig 文件不是添加自定义分析规则的好选择。

最好的方法是使用MSBuild函数Directory.Build.props文件来添加它们,这样更纯净。

1) 创建规则集文件并添加要用于 Debug

的任何代码分析

2) 在您的项目文件夹下添加一个名为 Directory.Build.props 的文件

3) 在文件下添加这些:

<Project>

  <PropertyGroup Condition="'$(Configuration)'=='Debug'">

    <!--the full path of your ruleset file for Debug mode-->
    <CodeAnalysisRuleSet>xxx\RuleSet1.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>


</Project>

So 当您使用 Release 构建项目时,由于 msbuild 条件,规则集将跳过并且仅适用于 [=31] =]调试模式。

您还可以为发布模式添加另一个规则集。并在各自规则集文件中对应配置下添加代码Analysis。

TLDR

您可以像这样在 Directory.Build.props 中设置 .editorconfig 文件:

<Project>
    <ItemGroup Condition="'$(Configuration)'=='Debug'">  
        <EditorConfigFiles Include="xxx\debug.editorconfig" Link=".editorconfig"/>
    </ItemGroup>

    <ItemGroup Condition="'$(Configuration)'=='Release'">
        <EditorConfigFiles Include="xxx\release.editorconfig" Link=".editorconfig"/>
    </ItemGroup>
</Project>

深入探讨

我们公司也有同样的问题。我们想为调试和发布配置的一个特定规则设置不同的严重性。我们想要这个的原因是因为当开发人员在开发环境中(在 his/her 计算机中)收到警告时,拉取请求在 Azure DevOps 环境中的项目或解决方案构建阶段出现错误。

顺便说一句,我们有一个名为 CodingGuideline 的存储库来存储我们的 .editorconfig 文件并引用一些分析器,例如 StyleCop.同时,这个仓库是一个nuget包。我们所有的存储库都引用了这个包。

我们有如下一些解决方案:

解决方案 1

  • 我们可以存储 .editorconfigreview.editorconfig 单独的文件。开发人员已经有存储库目录来保存公司存储库,每个人都手动将 .editorconfig 放到这个目录中。 (如果你不想手动放置配置文件,你可以尝试解决方案2)这样,整个存储库将遵循相同的代码风格和编码规则。

  • 如果任何开发人员创建拉取请求,CodingGuideline 存储库将自动克隆到构建目录。克隆后,review.editorconfig 个文件正在复制,命名为 .editorconfig。而已。当 dotnet 构建命令是 运行 并且一些定义 review.editorconfig 的规则被破坏时,拉取请求将抛出错误。

解决方案 2

  • 如果我们不想手动放置配置文件,我们可以通过nuget包部署配置文件。在此选项中,我们存储 development.editorconfigreview.editorconfig 单独的文件。我们不能将文件名用作 .editorconfig,因为我们无法部署具有此名称的文件。

  • 我们应该创建 CodingGuideline.targets(ProjectName.targets) 文件到 CodingGuideline nuget 包存储库并将此代码放入其中以将 development.editorconfig 复制为 .editorconfig.

    <Project>
        <Target Name="CodingGuidelineEditorConfig" AfterTargets="BeforeBuild" BeforeTargets="CoreBuild">
            <Copy SourceFiles="$(MSBuildThisFileDirectory)\development.editorconfig" DestinationFiles=".editorconfig" />
        </Target>
    </Project>
    
  • 当我们添加 CodingGuideline 对任何存储库的引用时,CodingGuideline.targets 将自动触发并将 .editorconfig 文件复制到每个项目根目录。

  • 拉取请求部分与解决方案 1 相同。


总结

如您所见,我们实际上不需要Directory.Build.props 对两种解决方案进行定义。当然,如果你想把这两个配置文件都保留在项目中,我不能干涉你的事。

顺便说一下,我们决定使用 .editorconfig 而不是 ruleset。因为这个 documentationruleset 如您所说已弃用,他们建议使用 .editorconfig.

我认为第一个解决方案比第二个解决方案好。因为 .editorconfig 文件在目录级别是唯一的,所以 repositories/solutions/projects 的 none 包含 .editorconfig 文件。但是开发人员必须手动将 .editorconfig 文件放入存储库根目录。

恰恰相反,第二种解决方案更加自动化,但整个存储库必须包含 .editorconfig。也许有办法从解决方案资源管理器中隐藏它,但我无法完全研究。

您也可以尝试保留 .editorconfig 文件并将其添加到您的项目(或某处的 Directory.Build.props 文件):

<PropertyGroup>
  <RunCodeAnalysis Condition="'$(Configuration)' == 'Debug'">false</RunCodeAnalysis>
</PropertyGroup>