InspectCode 命令行工具
JetBrains Rider 的一个最显著的功能——代码检查——即使在不打开 IDE 的情况下也可用。 InspectCode 是一个 免费跨平台的命令行工具,至少需要一个参数——您的解决方案文件——以应用 JetBrains Rider 的所有检查。
运行 InspectCode
下载 ReSharper 命令行工具。 使用下载按钮旁的选择器选择您的操作系统。
在任意目录中解压命令行工具包。
确保下载的 .zip 文件在解压前已“解除阻止”:右键单击文件,选择 属性 并单击 解除封锁。 如果未执行此操作,.NET 框架将以部分信任模式加载应用程序,这意味着它将无法正确加载或运行。
请运行以下命令:
InspectCode.exe YourSolution.sln -o=<PathToOutputFile>或者,您可以将 ReSharper 命令行工具作为 .NET 工具安装 ,并使用
jb命令运行 InspectCode。
默认输出格式
当 InspectCode 完成分析后,它会将结果保存为静态分析结果交换格式 (SARIF)。 输出的 .json 文件在命令提示符 -o=<PathToOutputFile> 中指定。 此文件包含在指定范围内(整个解决方案或特定项目)发现的所有代码问题。
如何处理输出结果取决于您。 但这里有一些推荐的后续步骤:将输出转换为 HTML 报告,或根据检测到的问题数量和类型在您的持续集成 (CI) 服务器上生成一些消息。
备用输出格式
InspectCode 还可以创建其他格式的输出文件,例如纯文本、XML 和 HTML。 要更改输出格式,请在命令行中添加 --format (-f) 参数,例如:
XML 输出格式结构
XML 包含两个部分:
发现的问题类型列表,其中每种类型对应于特定的检查,并具有以下属性:
ID— 允许将每个问题链接到相应的检查。类别— 可用于按 类别对类似问题进行分组。SubCategory— 如果某些问题类型具有相同的 SubCategory 属性,则表示这些问题是相同的,但出现在不同的语言或范围中。 您可以使用它进行进一步分组。描述— 描述问题。严重性— 显示检查的 严重级别。WikiUrl— 链接到相应的 代码检查索引 条目(如果有)。全局— 通知 解决方案范围的代码检查。
按项目分组的发现问题列表,其中每个问题具有以下属性:
TypeId— 允许将每个问题链接到相应的检查(报告第一部分中的IssueType)。文件— 受影响文件的路径,相对于解决方案。偏移量— 从文件开头到问题代码开头和结尾的符号偏移范围。折线图— 包含问题代码的行。消息— 问题的简短描述。严重性— 仅当问题的 严重级别与相应检查的严重级别不同步时才会出现此属性。 如果解决方案中的某些项目启用了“将警告视为错误”选项,而其他项目未启用,则可能会出现这种情况——在这种情况下,某些问题的严重级别将为“错误”,与原始的“警告”严重级别不同。
使用场景
现在让我们看看如何使用该工具以及如何处理其输出。 在本地机器上运行它可能会有所帮助,但仅当您没有 JetBrains Rider 时,因为使用 JetBrains Rider,您可以通过几次点击 获取选定范围的检查结果。
更有前景的情况是,在 CI 服务器上使用 InspectCode,您可以将其集成到构建脚本中,并将代码检查结果添加到构建报告和消息中。
JetBrains TeamCity 创建了以下由 InspectCode 检测到的代码问题的可视化展示:

有关更多信息,请参阅 TeamCity 文档或 下载最新版本的 TeamCity进行试用。
分析前构建解决方案
默认情况下,InspectCode 在开始分析之前 恢复 NuGet 包并构建目标解决方案。 这使得工具始终拥有正确的解决方案模型,并且仅发现相关的代码问题。
您将在输出中看到有关此的警告,可以通过明确指定 --build 或 --no-build 选项来抑制该警告。
在大多数情况下,建议保留默认行为或使用 --build 选项,因为即使您的 CI 链中已经包含在运行 InspectCode 之前的构建步骤,MSBuild 也会非常快速地处理最近构建的解决方案。
除此之外,还有一些场景需要 InspectCode 的构建以进行正确的分析。 例如,如果您的解决方案中有源生成器,InspectCode 将使用其自己的逻辑将生成的文件转储到磁盘。
然而,也有一些情况(例如 C++ 项目),不必要的构建可能会带来不必要的开销。 在这种情况下,请使用 --no-build 选项使 InspectCode 跳过构建。
使用 DotSettings 配置 InspectCode
如果您之前使用 JetBrains Rider 处理过目标解决方案,您可能已经 配置了代码检查设置。 如果是这样,InspectCode 将在 .DotSettings 文件中找到您的 自定义设置并应用它们。 如果没有设置文件,则所有检查将使用默认的严重级别。 除了代码检查的自定义严重级别外,InspectCode 还会在 .DotSettings 文件中查找以下设置:
是否启用了 解决方案范围的分析 (这可以在 .DotSettings 文件中配置,也可以通过
--swea/--no-swea参数配置)命名规则 (这只能通过 .DotSettings 文件配置)
从代码分析中排除的文件、文件夹和文件掩码。 您还可以使用
--include/--exclude命令行参数指定应包含在报告中的文件。生成代码的文件、文件掩码和区域,其中代码分析部分被禁用 (这只能通过 .DotSettings 文件配置)
如果您想在 CI 服务器上配置 InspectCode,您可以使用 JetBrains Rider 在本地完成所有配置, 将设置保存到解决方案团队共享层 ,然后将生成的 YourSolution.sln.DotSettings 文件提交到您的 VCS 中的解决方案目录。 服务器上的 InspectCode 将找到并应用这些设置。
或者,您可以通过 --设置 参数指定共享 .DotSettings 文件的路径(如果有,将覆盖其他设置文件中的设置)。
默认情况下,InspectCode 还会在目标解决方案上运行 Roslyn 分析器。 如果您想禁用 Roslyn 分析器,有两种方法可以实现:
使用
--属性参数,例如:InspectCode.exe YourSolution.sln -o=<PathToOutputFile> --properties=RunAnalyzers=false在解决方案的 .DotSettings 文件中,例如:
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <!-- Enable/disable Roslyn analyzers and Source Generators --> <s:Boolean x:Key="/Default/CodeInspection/Roslyn/RoslynEnabled/@EntryValue">False</s:Boolean> <!-- Include/exclude Roslyn analyzers in Solution-Wide Analysis --> <s:Boolean x:Key="/Default/CodeInspection/Roslyn/UseRoslynInSwea/@EntryValue">False</s:Boolean> </wpf:ResourceDictionary>
使用 EditorConfig 配置代码检查
如果您 使用 EditorConfig 来维护项目的代码样式,您还可以从 .editorconfig 文件中配置代码检查。
根据 EditorConfig 约定,JetBrains Rider 将应用定义在当前文件目录及其所有父目录中的名为 .editorconfig 的文件中的检查设置,直到到达根文件路径或找到带有 root=true 的 EditorConfig 文件。 在 .editorconfig 文件中指定的文件掩码,例如 *Test.cs ,也会被考虑在内。
.editorconfig 文件中的检查设置与其他属性的配置方式类似——通过添加相应的行:
例如,您可以通过以下行将 可能的 'System.NullReferenceException' 检查的 严重性级别更改为 错误:
或者,您可以通过以下行禁用 具有默认值的冗余参数检查:
您可以在 代码检查索引 部分的页面以及 EditorConfig 属性索引 页面上找到每个检查的 EditorConfig 属性。 — 只需使用浏览器搜索找到所需检查的属性。
使用命令行参数配置 InspectCode
我们已经在上文提到了一些可选参数。 以下是命令行参数的完整列表(您可以通过键入 InspectCode.exe --help 列出它们):
检查参数
--项目— 允许分析特定项目,而不是整个解决方案。 在此参数之后,您可以输入项目名称或与解决方案中多个项目匹配的通配符。 例如,--project=*Billing。--include/--exclude— 定义在检查报告中包含/排除哪些文件的文件掩码。 如果--包含和--排除都已定义并覆盖相同的文件集,则--排除将具有更高优先级。您可以在文件掩码中使用 Ant 风格通配符:
?匹配单个字符(不包括目录分隔符)*匹配零个或多个字符(不包括目录分隔符)**匹配任意数量的字符(包括目录分隔符)/或\匹配目录分隔符,无论操作系统路径格式如何
例如,模式
**Test?\**.*将匹配以下文件:C:\Projects\MyTestX\data\file_one.txt
/home/projects/TestY/file_two.xml
但不包括:
C:\Projects\Test\data\file_one.txt
/home/projects/TestY/file_two
要指定多个路径或通配符,请用分号
;分隔它们,或多次使用--include/--exclude参数。--swea和--no-swea— 这些参数允许您显式启用或禁用 解决方案范围分析。 否则,解决方案范围的分析将根据现有设置启用或禁用。--severity (-e)— 默认情况下,InspectCode 仅报告 建议及更高严重级别的问题。 此参数允许您将最小报告的严重级别更改为[INFO,HINT,SUGGESTION,WARNING,ERROR]。 例如,-e=WARNING。--dumpIssuesTypes-it— 使用此选项将所有现有的 代码检查转储到 输出中。 此选项应单独使用,而不是与实际分析一起使用,即不带解决方案参数。
与 MSBuild 相关的参数
--构建/--no-build— 允许您指定是否 在开始分析之前构建目标解决方案。 默认情况下,InspectCode 始终构建解决方案。--目标— 允许您指定在开始分析之前要执行的 MSBuild 目标。 您可以指定任何目标,但必须在目标解决方案的所有 .csproj 文件中定义。 默认情况下,执行构建目标。如果未构建解决方案,即指定了
--no-build参数,则--目标参数将不起作用。--属性——允许您覆盖 MSBuild 属性。 您可以单独设置每个属性(--properties:prop1=val1--properties:prop2=val2),或使用分号分隔多个属性--properties:prop1=val1;prop2=val2。请注意,分号不能用于值内部,例如:
--properties:ReferencePath="r:\reference1\;r:\reference2\"。 在这种情况下,请使用另一个--属性参数分别添加每个值——这些值将被组合。指定的属性将应用于所有分析的项目。 目前,没有直接的方法仅为特定项目设置属性。 解决方法是在此项目中创建一个自定义属性,并将其分配给所需的属性,然后在 InspectCode 参数中使用该自定义属性。
--工具集——使用此选项指定确切的 MSBuild 版本。 例如 12.0:--toolset=12.0默认情况下,使用可用的最高 MSBuild 版本。 如果您有多个相同版本的安装,例如来自 Visual Studio 2019 的 16.0 和来自 .NET Core 3.x 的 16.0,此选项可能不起作用。--toolset-path——使用此选项指定 MSBuild 的确切路径。 如果您有自定义的 MSBuild 安装并希望将其与 InspectCode 一起使用,这可能会有所帮助,例如:--toolset-path="c:\tools\msbuild\bin\MsBuild.exe"。--dotnetcore——默认情况下,.NET 安装是自动检测的。 如果自动检测导致冲突,您可以使用此选项指向特定的 .NET 安装。 使用时不带参数以忽略 .NET Core。 示例:--dotnetcore=/usr/local/share/dotnet/dotnet。--dotnetcoresdk——使用此选项指定应提供 MSBuild 的 .NET SDK 版本。 例如,如果您安装了带有 SDK 5.0.100 和 6.0.302 的 .NET,InspectCode 将优先选择 6.0.302(最新版本,包括预览版本)。 现在,如果您想使用 .NET SDK 5.0.100 运行 InspectCode,请在命令行中添加--dotnetcoresdk=5.0.100。--mono— 默认情况下,Mono 安装是自动检测的。 如果自动检测导致冲突,您可以使用此选项指向特定的 Mono 安装。 不带参数使用它以忽略 Mono。 示例:--mono=/Library/Frameworks/Mono.framework/Versions/Current/bin/mono。--targets-for-references— 自定义 MSBuild 目标的名称,这些目标将被执行以获取项目的引用程序集。 这些目标定义在项目文件或 .目标 文件中。 多个值用分号分隔。 例如,--targets-for-references="GetReferences"。--targets-for-items— 自定义 MSBuild 目标的名称,这些目标将被执行以获取项目的其他项(例如,Compile 项)。 这些目标定义在项目文件或 .目标 文件中。 多个值用分号分隔。 例如,--targets-for-items="GetCompileItems"。
辅助参数
--输出-o— 允许您设置输出文件。--format (-f)— 默认情况下,InspectCode 将其输出写入 SARIF 格式。 如果需要,您可以使用此参数[Html,Text,Xml]指定其他输出格式。 例如,-f=Text。要在一次运行中生成多个输出工件,请指定用分号分隔的所需格式,例如:
--format=Html;Xml;或多次添加此参数,例如--format=Html --format=Xml。 在生成多个工件时,您可以在--输出参数中指定一个目录,文件名将自动生成;或者您可以指定一个文件名,不同的文件扩展名将用于不同的工件。--jobs (-j)— 默认情况下,InspectCode 使用启发式方法拆分其任务,并使用尽可能多的线程/核心并行运行。 如果需要,您可以限制线程数量,例如,-j=4。--absolute-paths (-a)— 默认情况下,InspectCode 报告中的文件路径是相对于解决方案文件的。 您可以使用此开关在报告中使用绝对路径。--debug (-d)— 使用此选项将 InspectCode 的执行详细信息添加到输出中。 如果您在使用 InspectCode 时遇到问题,这些详细信息在联系 支持团队时会很有帮助。--详细程度— 默认情况下,InspectCode 仅在输出中显示错误消息。 使用此参数更改输出中写入信息的详细程度,以下是级别(从少到多):[OFF,FATAL,ERROR,WARN,INFO,VERBOSE,TRACE]。--LogLevel— 使用此参数控制写入日志文件的信息量,通过--LogFile或--LogFolder指定。 以下是级别(从少到多详细):[OFF,FATAL,ERROR,WARN,INFO,VERBOSE,TRACE]。例如,如果 InspectCode 出现问题,您可以联系 JetBrains Rider 支持并共享包含所有 TRACE 消息的日志文件:
--LogLevel=TRACE。--LogFile— 使用此参数为 InspectCode 的消息指定日志文件的绝对路径。 如果您还需要 MSBuild 和 Roslyn 的日志,请改用--LogFolder参数。--LogFolder— 使用此参数指定一个绝对路径到目录,其中应写入 InspectCode 的日志以及 MSBuild 和 Roslyn 的日志。 如果您只需要 InspectCode 的日志,请改用--LogFile参数。--caches-home— 允许您为 InspectCode 缓存的数据指定自定义位置。 默认情况下,使用 %LOCALAPPDATA% 目录,除非有设置文件,在这种情况下使用其中指定的目录。 如果您希望为缓存使用快速 SSD 磁盘,或者希望将所有构建处理数据存储在一个地方,此参数可能会有所帮助。--config-create和--配置— 这些选项允许您通过配置文件传递上述参数。 第一个选项将根据当前参数创建一个配置文件;第二个选项用于从该文件加载参数。--eXtensions (-x)— 安装并启用指定的插件。插件通过其 ID 指定,您可以在 JetBrains Marketplace的插件页面上找到:找到所需的插件并滚动到 概览 选项卡的底部。
例如, StyleCop by JetBrains 插件的插件 ID 是
StyleCop.StyleCop,要使用此插件运行 InspectCode,您需要在命令行中添加-x=StyleCop.StyleCop。要指定多个插件,请用分号分隔它们的 ID。
--源— 允许您指定一个自定义包源以安装插件,即包含插件的 .nupkg 文件所在的目录,例如--source="C:\plugins"。 如果未指定任何内容,InspectCode 将在 JetBrains Marketplace中查找插件。--测量——一个诊断选项,如果您在特定硬件上运行工具时遇到性能问题,可以帮助您。 使用此选项并结合以下参数之一[sampling|timeline(仅限 Windows)|memory]定义分析类型,例如:InspectCode.exe YourSolution.sln -o=<PathToOutputFile>执行完成后,除了问题报告文件外,InspectCode 还会创建一个执行快照并显示快照文件的路径。 您可以使用 JetBrains 工具研究快照:
采样或 时间线分析:要分析生成的 .zip 文件,请解压并使用 JetBrains dotTrace打开采样快照文件( .dtp )或时间线快照文件( .dtt )。
内存分析:要分析生成的 dotMemory 工作区文件( .dmw ),请使用 JetBrains dotMemory打开它。
--version (-v)— 使用此选项显示工具的当前版本并退出。--no-updates— 默认情况下,InspectCode 在每次运行时检查更新。 使用此选项禁用更新检查。
控制 ReSharper 设置的参数
--设置— 默认情况下,InspectCode 将使用 “解决方案团队共享”层 SolutionName.DotSettings 中的 ReSharper 设置覆盖其默认设置(如果存在)。 如果需要,您可以使用此参数指定另一个 .DotSettings 文件,该文件将覆盖所有其他设置。 例如,--settings="C:\Work\MyRsSettings.DotSettings"。
--disable-settings-layers (-dsl)— 禁用指定的 设置层。 接受的值:GlobalAll、GlobalPerProduct、SolutionShared、SolutionPersonal--no-buildin-settings— 禁用全局、解决方案和项目设置层的设置。 等同于--disable-settings-layers: GlobalAll,GlobalPerProduct,SolutionShared,SolutionPersonal,ProjectShared,ProjectPersonal。
以下是使用一些命令行选项运行 InspectCode 的示例:
MSBuild. 可能的问题和解决方案
当 InspectCode 接收到目标解决方案文件时,它需要创建一个要检查的文件列表并初始化一些属性,例如语言版本。 InspectCode 使用 MSBuild 从项目文件中获取此信息。
在大多数情况下,InspectCode 会自动找到适合目标解决方案的 MSBuild 可执行文件。 但可能会有一些问题阻止自动检测,例如解决方案运行时的版本与已安装的 .NET SDK 的版本不匹配。
如果 InspectCode 出现类似 .NET SDK 当前不支持以 .NET Core 3.0 为目标版本。 或 找不到指定的 SDK“Microsoft.NET.Sdk”。 的错误,您需要使用额外的 参数指定正确的 SDK 或运行时。 如果您使用 .NET,MSBuild 已经安装在您的机器上,并且通常存在多个安装,因此您需要提供一个适合目标解决方案的版本。
在大多数情况下,您只需添加一个参数——--工具集 或 --dotnetcore。 在复杂的情况下,例如机器上有许多不同的安装或使用自定义版本的 MSBuild,您可能需要其他参数: --toolset-path、 --mono、 --targets-for-references、 --targets-for-items。
当您指定 --dotnetcore 或 --dotnetcoresdk 时,InspectCode 将尝试使用来自 .NET SDK 的 MSBuild 并忽略其他版本。 例如,如果您的机器上有多个 MSBuild v 16.0 的安装,并通过 --dotnetcore 指定 .NET 安装路径,InspectCode 将使用来自指定安装的 .NET MSBuild。 当未指定 --dotnetcore 时,InspectCode 将查看解决方案目录,尝试找到 global.json ,并使用其中指定的 SDK 版本。 如果未找到任何内容,将使用最新可用的 SDK 版本。
项目引用。 可能的问题和解决方案
InspectCode 还使用 MSBuild 来解析引用的项目和程序集中的符号。 有两个项目属性允许根据环境使用不同的引用: 平台 和 配置。 如果运行 InspectCode 的环境与项目上次构建的环境不同,您可能会收到类似 无法解析引用 XXX:MsBuild 未能完成引用解析 或 无法解析此引用。找不到程序集“XXX” 找不到程序集“XXX” 的错误。
如果您收到此类错误,请检查输出以查看构建配置是否存在不匹配。 例如
在上述内容中,您可以看到项目文件中指定的平台是 x86 ,但工具正在以 64 位模式运行。 要解决此问题,请使用 --属性 参数明确指定目标平台和配置: --properties:Platform=x64;Configuration=Debug。
支持的语言
InspectCode 在以下语言中查找代码问题:
|
|
|
|
|
|
|
| |
|---|---|---|---|---|---|---|---|---|