免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

在 .NET runtime 仓库中为构建接入 Roslyn 分析器:包接线、规则调级与验证指南

在 .NET runtime 仓库中为构建接入 Roslyn 分析器:包接线、规则调级与验证指南 在 .NET runtime 仓库中为构建接入 Roslyn 分析器包接线、规则调级与验证指南【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtimedotnet/runtime即本仓库是整个 .NET 平台的核心实现包含 CoreCLR 运行时、BCL 类库与 Mono 运行时代码量极为庞大。为保证海量代码的正确性、性能与可维护性仓库将 .NET Compiler PlatformRoslyn分析器 为主线结合 eng/Analyzers.targets 与两份 globalconfig 的真实内容完整讲解仓库已接入了哪些分析器、如何新增一个分析器包、如何逐条调整规则严重级别、以及如何在“警告即错误”的默认构建策略下安全地推进新规则落地。读完本文你将具备在本仓库以及结构类似的 .NET 大型仓库中自主接入并驯服 Roslyn 分析器的完整能力。一、仓库的静态分析体系概览仓库文档开宗明义本仓库依赖 .NET Compiler PlatformRoslyn分析器来帮助校验代码的正确性correctness、性能performance与可维护性maintainability。这不是一套可选的美化工具而是构建的正式组成部分——分析器通过PackageReference被声明在构建工程文件中随每次构建加载扫描仓库中所有编译的源码工程。从实际接线文件 eng/Analyzers.targets 可以看到仓库当前默认接入了五个分析器包包名作用领域版本来源Microsoft.DotNet.CodeAnalysis仓库自研的 .NET 内部约定规则BCL 系列规则、API 面约束等$(MicrosoftDotNetCodeAnalysisVersion)定义于 eng/Version.Details.propsMicrosoft.CodeAnalysis.NetAnalyzers.NET 官方推荐分析器CA 系列含性能、安全、可靠性规则$(MicrosoftCodeAnalysisNetAnalyzersVersion)Microsoft.CodeAnalysis.CSharp.CodeStyleC# 代码风格规则IDE 系列$(MicrosoftCodeAnalysisCSharpCodeStyleVersion)与 Visual Studio 最新 Roslyn 版本同步见 eng/Versions.propsMicrosoft.CodeAnalysis.Analyzers面向“分析器作者”自身的元分析器RS 系列$(MicrosoftCodeAnalysisAnalyzersVersion)StyleCop.AnalyzersStyleCop 风格与布局规则SA 系列$(StyleCopAnalyzersVersion)仓库当前锁定为1.2.0-beta.556见 eng/Versions.props这些包统一声明了PrivateAssetsall意味着它们只参与当前工程的编译期分析不会作为依赖流向下游程序集也不会污染产物。其中Microsoft.DotNet.CodeAnalysis额外带有IsImplicitlyDefinedtrue表明它是仓库基础设施层面默认隐式提供的。二、接线文件的运行机制eng/Analyzers.targets 详解所有分析器配置的“总开关”都在 eng/Analyzers.targets 中理解它的几个条件分支比单纯照抄一条PackageReference重要得多。2.1 何时彻底关闭分析器仓库在某些特殊工程类型上会显式关闭分析器以避免在“根本没有源码可分析”的项目上做无意义的工作甚至触发依赖解析问题PropertyGroup Condition$(UsingMicrosoftNoTargetsSdk) true or $(UsingMicrosoftDotNetSharedFrameworkSdk) true or $(MSBuildProjectExtension) .pkgproj or $(UsingMicrosoftTraversalSdk) true !-- Explicitly disable running analyzers to avoid trying to discover the correct ILLink tool pack for a project that has no sources. -- RunAnalyzersfalse/RunAnalyzers /PropertyGroup如注释所述对于 NoTargets SDK、共享框架 SDK、.pkgproj打包工程与 Traversal 聚合工程这类没有编译源文件的项目强行跑分析器只会浪费时间去找不存在的 ILLink 工具包因此直接关闭。此外在源码构建sourcebuild模式下分析器同样会被关闭RunAnalyzers Condition$(DotNetBuildSourceOnly) truefalse/RunAnalyzers EnableNETAnalyzers Condition$(EnableNETAnalyzers) $(RunAnalyzers)/EnableNETAnalyzers这里还揭示了一个重要关系.NET 官方 NetAnalyzers 是否启用EnableNETAnalyzers默认直接跟随RunAnalyzers的值。如果你在命令行显式传入-p:EnableNETAnalyzerstrue则可以单独把它重新打开。2.2 单文件发布分析器与规则配置文件在分析器开启的前提下$(RunAnalyzers) ! false对面向.NETCoreApp的源码工程还会默认启用 Single File 分析器用于在“发布为单文件应用”场景下提前发现Assembly.Location等 API 的误用EnableSingleFileAnalyzer Condition $(EnableSingleFileAnalyzer) and $(TargetFrameworkIdentifier) .NETCoreApp and $(IsSourceProject) truetrue/EnableSingleFileAnalyzer同时规则严重级别的配置文件被以EditorConfigFiles形式注入EditorConfigFiles Include$(MSBuildThisFileDirectory)CodeAnalysis.src.globalconfig /2.3 源码工程与测试工程使用不同的规则集这是仓库配置中非常关键的一处设计测试代码的约束比产品源码宽松得多。IsTestProject为true时会先移除源码用的CodeAnalysis.src.globalconfig再换上专门针对测试的CodeAnalysis.test.globalconfigItemGroup Condition$(IsTestProject) true EditorConfigFiles Remove$(RepositoryEngineeringDir)CodeAnalysis.src.globalconfig / EditorConfigFiles Include$(RepositoryEngineeringDir)CodeAnalysis.test.globalconfig / /ItemGroup对比如下两份文件即可直观感受差异。以CA1802Use literals where appropriate为例源码配置 eng/CodeAnalysis.src.globalconfigdotnet_diagnostic.CA1802.severity warning并且通过dotnet_code_quality.CA1802.api_surface private, internal把检查面限定在私有/内部成员上测试配置 eng/CodeAnalysis.test.globalconfigdotnet_diagnostic.CA1802.severity none直接静默。再如CA2007Consider calling ConfigureAwait on the awaited task源码中是warning测试中为none。而像SYSLIB1040~SYSLIB1043InvalidGeneratedRegexAttributeusage这种会直接产出错误代码的规则在两份配置中都固定为error无论源码还是测试都不允许违背。三、实操如何向构建中添加一个新的分析器包文档给出了清晰的三步流程我们结合仓库实际接线方式逐条展开并补充每一步的注意事项。步骤 1选定要引入的分析器包文档以 SonarSource 的SonarAnalyzer.CSharp为例——它在 NuGet 上的包名为SonarAnalyzer.CSharp。文档记录到撰写时点的最新版本为8.50.0.58025。选包时需注意两点确认包面向的 Roslyn 版本与仓库当前使用的编译器的兼容性——仓库的 Roslyn 版本跟随eng/Versions.props中的MicrosoftCodeAnalysisVersion_LatestVS当前为5.0.0-2.26070.104等属性过老的分析器无法在过新的编译器上运行反之亦然确认规则默认启用的数量——大型分析器包默认启用数百条规则接入后首次构建会暴露大量诊断建议先在本地用-warnAsError 0摸底见第五节。步骤 2在 eng/Analyzers.targets 中添加 PackageReference打开 eng/Analyzers.targets在已有的PackageReference组ItemGroup Condition$(RunAnalyzers) ! false内追加条目。文档给出的模板如下PackageReference IncludeSonarAnalyzer.CSharp Version8.50.0.58025 PrivateAssetsall /把这条声明放在上述条件组内意味着只有在RunAnalyzers未被关闭非 NoTargets/pkgproj/源码构建等的工程上才会加载它PrivateAssetsall保证该分析器不会泄露到下游依赖图中。步骤 3在 globalconfig 中调整规则的严重级别接入新包后所有默认开启的规则会立即生效。若某些规则过于激进、与仓库既有代码风格冲突或某些规则需要升级为硬性错误就在以下两个文件之一中添加对应条目eng/CodeAnalysis.src.globalconfig —— 作用于所有产品源码工程eng/CodeAnalysis.test.globalconfig —— 作用于所有测试工程。条目格式统一为dotnet_diagnostic.规则ID.severity 级别可用的严重级别及含义如下级别语义典型用途error编译失败违反会产出错误行为或破坏 API 约定的规则如SYSLIB1040、RS1035、CA2252warning产生警告仓库默认的大部分性能/可靠性规则suggestion提示建议代码风格类规则如IDE0001Simplify namesilent仅在 IDE 内提示不进入输出IDE 自动重构类规则如IDE0007Use implicit typenone完全禁用与仓库编码风格冲突的规则绝大多数 CA 命名/设计规则在测试配置中被设为 noneglobalconfig 还支持更精细的作用域控制。例如仓库对CA1052Static holder types同时限制了 API 面dotnet_diagnostic.CA1052.severity warning dotnet_code_quality.CA1052.api_surface private, internal又如CA2208Instantiate argument exceptions correctly限定只检查公开 APIdotnet_diagnostic.CA2208.severity warning dotnet_code_quality.CA2208.api_surface publicdotnet_code_quality.*这一族选项可用于按api_surfacepublic/internal/private、按符号种类等维度缩小规则检查范围是大型代码库中避免误报的利器。值得一提的是globalconfig 第一行固定为is_global true声明这是一份全局级 EditorConfig 配置其中的规则设置会应用到整个编译单元而不受目录层级影响。四、仓库的自研分析器PlatformDocAnalyzer 实例除了消费 NuGet 上的第三方分析器仓库还在仓库内维护自己的 Roslyn 分析器——eng/analyzers/PlatformDocAnalyzer。其用途见 eng/analyzers/README.md是强制平台特定类库启用了UseCompilerGeneratedDocXmlFiletrue遵循文档放置约定。对于按平台拆分实现的类库如 Unix/Windows 各自实现编译期生成的 XML 文档文件在多个目标之间会产生冲突PlatformDocAnalyzer 通过静态检查保证文档注释被放置在正确的位置。它的接入方式与第三方包不同——不是PackageReference而是以工程引用的形式注入并在 eng/Analyzers.targets 中通过属性开关控制!-- PlatformDocAnalyzer: Enforce documentation conventions for platform-specific libraries. Opt-in via EnablePlatformDocAnalyzer; src/libraries enables this by default for src projects. -- ItemGroup Condition$(EnablePlatformDocAnalyzer) true and $(MSBuildProjectExtension) .csproj and $(RunAnalyzers) ! false ProjectReference Include$(RepositoryEngineeringDir)analyzers\PlatformDocAnalyzer\PlatformDocAnalyzer.csproj ReferenceOutputAssemblyfalse OutputItemTypeAnalyzer SetConfigurationConfiguration$(LibrariesConfiguration) / /ItemGroup注意其中的关键参数EnablePlatformDocAnalyzer为真才启用src/libraries层默认对源码工程开启可查src/libraries下的构建属性确认ReferenceOutputAssemblyfalseOutputItemTypeAnalyzer只把编译产物当作分析器加载而不是作为普通程序集引用配套的 PlatformDocAnalyzer.props 被条件导入用于补充该分析器的属性配置。该分析器还带有独立测试工程 eng/analyzers/PlatformDocAnalyzer.Tests/PlatformDocAnalyzerTests.cs。仓库明确说明这些测试不进入主 CI 测试流水线与IntrinsicsInSystemPrivateCoreLibAnalyzer.Tests等基础设施分析器测试一致修改分析器后需本地手动运行dotnet test eng/analyzers/PlatformDocAnalyzer.Tests/PlatformDocAnalyzer.Tests.csproj这个例子展示了在 dotnet/runtime 中“自研分析器”的标准姿势分析器本身作为仓库内工程编译用条件开关接入并用专门的测试工程守护其行为。五、处理“警告即错误”的默认策略仓库的构建系统默认把所有警告当作错误处理。这一点在构建脚本中有直接证据eng/common/build.ps1 的参数声明[bool] $warnAsError $trueeng/common/tools.ps1 同样默认$warnAsError true。在这种策略下接入新分析器后的首次构建会极其痛苦默认开启的成百上千条新规则会在全仓库范围内一次性爆发而每一条都会让编译直接失败。文档给出的建议是先临时关闭“警告即错误”以警告形式暴露全部问题逐批修复后再恢复为错误。在仓库根目录正常构建的完整命令为build.cmdUnix 上为./build.sh。临时关闭“警告即错误”build.cmd -warnAsError 0对应的参数在 eng/common/build.sh 中也有明确声明--warnAsError value Sets warnaserror msbuild parameter (true or false)这里传入的0最终会被映射为 MSBuild 的TreatWarningsAsErrorsfalse。推荐的推进节奏是以-warnAsError 0构建收集新规则的全部告警清单将短期内无法修复、或与仓库现状冲突的规则在对应的 globalconfig 中降为none或suggestion对值得强制执行的规则逐个修复代码后将级别设为warning并保持warnAsError 1默认验证全部清零后把真正重要的规则升级为error如SYSLIB1040系列的做法。六、快速自查清单接入一个分析器包后建议按以下清单核验确保配置正确落位检查项验证方式包是否已加入 eng/Analyzers.targets 的RunAnalyzers ! false条件组内查看文件内PackageReference列表PrivateAssetsall是否设置确认不会污染下游依赖版本号是否来自 eng/Versions.props / eng/Version.Details.props 的集中属性不要在 targets 里硬编码与仓库不一致的版本规则级别是否已按 源码/测试 分别评估对照 eng/CodeAnalysis.src.globalconfig 与 eng/CodeAnalysis.test.globalconfig首次构建是否使用-warnAsError 0摸底见第五节命令是否误在 NoTargets/pkgproj/源码构建 等场景强行开启检查RunAnalyzers的条件分支七、总结在 dotnet/runtime 这样规模的仓库中Roslyn 分析器不是可选项而是保证代码正确性、性能与可维护性的工程基线。其核心机制可以浓缩为三句话包接线集中在 eng/Analyzers.targets 一处规则严重级别通过 eng/CodeAnalysis.src.globalconfig 与 eng/CodeAnalysis.test.globalconfig 按源码/测试双轨管理默认“警告即错误”的构建策略配合-warnAsError 0提供安全的试错窗口。掌握了这三层你不仅能按文档指引接入SonarAnalyzer.CSharp等第三方分析器也能像仓库维护 PlatformDocAnalyzer 一样沉淀出属于自己的、可测试的仓库级分析规则。【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表