【问题标题】:Specify separate .editorconfig files between debug and release configurations在调试和发布配置之间指定单独的 .editorconfig 文件
【发布时间】:2021-04-22 11:26:00
【问题描述】:

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

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

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

或者是否可以禁用此 .editconfig 进行构建并仅适用于手动代码分析?

【问题讨论】:

    标签: visual-studio msbuild visual-studio-2019 editorconfig


    【解决方案1】:

    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>
    

    深入了解

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

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

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

    解决方案 1

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

    • 如果任何开发人员创建拉取请求,CodingGuideline 存储库将自动克隆到构建目录。克隆后,review.editorconfig 文件被复制命名为.editorconfig。而已。当运行 dotnet build 命令并且定义 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 文件复制到每个项目的根目录。

    • 拉取请求部分同方案一。


    总结

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

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

    我认为第一个解决方案比第二个解决方案更好。因为.editorconfig 文件在目录级别是唯一的,所以没有一个存储库/解决方案/项目包含.editorconfig 文件。但是开发者必须手动将.editorconfig 文件放到仓库根目录下。

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

    【讨论】:

      【解决方案2】:

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

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

      1) 创建一个规则集文件并添加您想要用于调试

      的任何代码分析

      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>
      

      所以当您使用 Release 构建项目时,由于 msbuild 条件,规则集将跳过并且仅适用于 Debug 模式。

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

      【讨论】:

      • 我在看一个复数教程,它说规则集将来不会很好地维护,最终它们将被 .editorcofigs 取代。你对此有何评论?参考:app.pluralsight.com/library/courses/…
      • @CharithJ,没有 Microsoft 文档表明 VS 将放弃规则集。而对于经典而传统的规则集方式,Vs 没有理由放弃它,至少它会保留它。而对于很多使用规则集的用户来说,放弃它是不科学的。如果微软真的要放弃它,微软肯定会有缓冲的方法,至少可以保证规则集还在使用。我认为您不必为此担心太多。您仍然可以使用规则集,它对代码分析非常有用。
      • 谢谢!你能想到任何解决方法来排除 .editorconfig 仅用于调试版本吗?还是对于所有构建并仅手动执行?如果我们要使用规则集,我们有近千条规则可能需要添加到规则集中。
      • 也许试试这个:&lt;Choose&gt;&lt;When Condition="'$(Configuration)'=='Release'"&gt;&lt;ItemGroup&gt;&lt;None Include=".editorconfig" /&gt; &lt;/ItemGroup&gt; &lt;/When&gt; &lt;/Choose&gt;
      • @dogukanarkan's answer 是未来的最佳方法,IMO。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-05-07
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 2010-09-15
        相关资源
        最近更新 更多