InspectCode 命令行工具
ReSharper 的一项最显著功能 — 代码检查 — 即使不打开 IDE 也可用。 InspectCode 是一个 免费跨平台的命令行工具,至少需要一个参数(您的解决方案文件)来应用 ReSharper 的所有检查。
运行 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 属性,则表示这些问题相同,但出现在不同语言或不同范围中。 您可以使用它进行进一步分组。描述— 描述问题严重性— 显示检查的 严重性级别。Wiki 链接— 链接到相应的 代码检查索引 条目(如果有)。全局— 通知 解决方案范围的代码检查。
按项目分组的发现问题列表,其中每个问题具有以下属性:
类型标识— 允许将每个问题链接到相应的检查(报告第一部分中的问题类型)。文件— 受影响文件的路径,相对于解决方案。偏移量— 从文件开头到问题代码开头和结尾的符号偏移范围。行号— 包含问题代码的行。消息— 问题的简短描述。严重性— 仅当问题的 严重性 与相应检查的严重性不同步时才会出现此属性。 如果解决方案中的某些项目启用了“将警告视为错误”选项,而其他项目未启用,则可能会出现这种情况——在这种情况下,某些问题的严重性将为“错误”,与原始“警告”严重性不同。
使用场景
现在让我们看看如何使用该工具以及如何处理其输出。 在本地机器上运行它可能会有所帮助,但仅当您没有 ReSharper 时,因为使用 ReSharper,您可以通过几次点击 获取选定范围的检查结果。 如果需要,您可以 将检测到的问题导出到报告文件。 此外,使用 ReSharper,您可以 打开 InspectCode 报告。
更有前景的情况是在 CI 服务器上使用 InspectCode,您可以将其集成到构建脚本中,并将代码检查结果添加到构建报告和消息中。
JetBrains TeamCity 创建了以下由 InspectCode 检测到的代码问题的可视化展示:

有关更多信息,请参阅 TeamCity 文档 或 下载最新版本的 TeamCity 进行试用。
分析前构建解决方案
默认情况下,InspectCode 在开始分析之前 恢复 NuGet 包并构建目标解决方案。 这使得工具始终拥有正确的解决方案模型,并且仅发现相关的代码问题。
您将在输出中看到有关此的警告,可以通过明确指定 --build 或 --no-build 选项来抑制。
在大多数情况下,建议保留默认行为或使用 --build 选项,因为即使您的 CI 链中已经包含在运行 InspectCode 之前的构建步骤,MSBuild 也会非常快速地处理最近构建的解决方案。
除此之外,还有一些场景需要 InspectCode 的构建以进行正确的分析。 例如,如果您的解决方案中有源生成器,InspectCode 将使用其自己的逻辑将生成的文件转储到磁盘。
然而,也有一些情况(例如 C++ 项目)中,不必要的构建可能会带来不必要的开销。 在这种情况下,请使用 --no-build 选项使 InspectCode 跳过构建。
使用 DotSettings 配置 InspectCode
如果您之前使用 ReSharper 处理过目标解决方案,您可能已经 配置了代码检查设置。 如果是这样,InspectCode 将在 .DotSettings 文件中找到您的 自定义设置 并应用它们。 如果没有设置文件,则所有检查将使用默认的严重性级别。 除了代码检查的自定义严重性级别外,InspectCode 还会在 .DotSettings 文件中查找以下设置:
是否启用了 解决方案范围的分析 (这可以在 .DotSettings 文件中配置,或通过
--swea/--no-swea参数配置)命名规则 (这只能通过 .DotSettings 文件配置)
从代码分析中排除的文件、文件夹和文件掩码。 您还可以使用
--include/--exclude命令行参数指定应包含在报告中的文件。包含生成代码的文件、文件掩码和区域,其中代码分析部分被禁用 (这只能通过 .DotSettings 文件配置)
代码分析引擎应存储缓存的位置。 You can specify it on the page of ReSharper 选项 Alt+R, O or with the
--caches-homecommand-line parameter.目标语言()
如果您想在 CI 服务器上配置 InspectCode,您可以使用 ReSharper 在本地完成所有配置, 将设置保存到解决方案团队共享层 ,然后将生成的 YourSolution.sln.DotSettings 文件提交到您的 VCS 中的解决方案目录。 服务器上的 InspectCode 将找到并应用这些设置。
或者,您可以通过 --settings 参数指定共享 .DotSettings 文件的路径(如果有,将覆盖其他设置文件中的设置)。
默认情况下,InspectCode 还会在目标解决方案上运行 Roslyn 分析器。 如果您想禁用 Roslyn 分析器,有两种方法可以实现:
使用
--properties参数,例如: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 的约定,ReSharper 将应用定义在名为 .editorconfig 的文件中的检查设置,这些文件位于当前文件的目录及其所有父目录中,直到到达根文件路径或找到带有 root=true 的 EditorConfig 文件。 在 .editorconfig 文件中指定的文件掩码,例如 *Test.cs ,也会被考虑。
在 .editorconfig 文件中的检查设置配置方式与其他属性类似——通过添加相应的行:
例如,您可以通过以下行将 严重性级别 的 可能的 'System.NullReferenceException' 检查更改为 错误:
或者,您可以通过以下行禁用 具有默认值的冗余参数 检查:
您可以在 代码检查索引 部分的页面以及 EditorConfig 属性索引 页面上找到每个检查的 EditorConfig 属性。 — 只需使用浏览器搜索即可找到所需检查的属性。
使用命令行参数配置 InspectCode
我们已经在上面提到了一些可选参数。 以下是命令行参数的完整列表(您可以通过键入 InspectCode.exe --help 列出它们):
检查参数
--project— 允许分析特定项目,而不是整个解决方案。 在此参数之后,您可以键入项目名称或与解决方案中多个项目匹配的通配符。 例如,--project=*Billing。--include/--exclude— 定义在检查报告中包含/排除哪些文件的文件掩码。 如果--include和--exclude都已定义并覆盖相同的文件集,--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 相关的参数
--build/--no-build— 允许您指定是否在开始分析之前 构建目标解决方案。 默认情况下,InspectCode 总是构建解决方案。--target— 允许您指定在开始分析之前要执行的 MSBuild 目标。 您可以指定任何目标,但必须在目标解决方案的所有 .csproj 文件中定义。 默认情况下,执行构建目标。如果未构建解决方案,即指定了
--no-build参数,则--target参数将不起作用。--properties— 允许您覆盖 MSBuild 属性。 您可以单独设置每个属性(--properties:prop1=val1--properties:prop2=val2),或使用分号分隔多个属性--properties:prop1=val1;prop2=val2。请注意,分号不能用于值内部,例如:
--properties:ReferencePath="r:\reference1\;r:\reference2\"。 在这种情况下,使用另一个--properties参数单独添加每个值 — 这些值将被组合。指定的属性将应用于所有分析的项目。 目前,没有直接的方法仅为特定项目设置属性。 解决方法是,在该项目中创建一个自定义属性并将其分配给所需属性,然后在 InspectCode 参数中使用该自定义属性。
--toolset— 使用此选项指定确切的 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"。
辅助参数
--output-o— 允许您设置输出文件。--format (-f)— 默认情况下,InspectCode 将其输出写入 SARIF 格式。 如果需要,您可以使用此参数[Html, Text, Xml]指定其他输出格式。 例如:-f=Text。要在一次运行中生成多个输出工件,请用分号分隔所需的格式,例如:
--format=Html;Xml;或多次添加此参数,例如--format=Html --format=Xml。 在生成多个工件时,您可以在--output参数中指定一个目录,文件名将自动生成;或者您可以指定一个文件名,不同的文件扩展名将用于不同的工件。--jobs (-j)— 默认情况下,InspectCode 使用启发式方法拆分其任务,并使用尽可能多的线程/核心并行运行。 如果需要,您可以限制线程数量,例如,-j=4。--absolute-paths (-a)— 默认情况下,InspectCode 报告中的文件路径是相对于解决方案文件的。 您可以使用此开关在报告中使用绝对路径。--debug (-d)— 使用此选项将 InspectCode 的执行详细信息添加到输出中。 如果您在使用 InspectCode 时遇到问题,这些详细信息在联系 支持团队 时会很有帮助。--verbosity— 默认情况下,InspectCode 仅在输出中显示错误消息。 使用此参数更改写入输出的信息量,以下是级别(从少到多详细):[OFF, FATAL, ERROR, WARN, INFO, VERBOSE, TRACE]。--LogLevel— 使用此参数控制写入日志文件的信息量,通过--LogFile或--LogFolder指定。 以下是级别(从少到多详细):[OFF, FATAL, ERROR, WARN, INFO, VERBOSE, TRACE]。例如,如果 InspectCode 出现问题,您可以联系 ReSharper 支持并分享包含所有 TRACE 消息的日志文件:
--LogLevel=TRACE。--LogFile— 使用此参数为 InspectCode 消息指定日志文件的绝对路径。 如果您还需要 MSBuild 和 Roslyn 的日志,请改用--LogFolder参数。--LogFolder— 使用此参数为 InspectCode 以及 MSBuild 和 Roslyn 的日志指定一个目录的绝对路径。 如果您只需要 InspectCode 的日志,请改用--LogFile参数。--caches-home— 允许您为 InspectCode 缓存的数据指定自定义位置。 默认情况下,使用 %LOCALAPPDATA% 目录,除非存在设置文件,在这种情况下使用指定的目录。 此参数在您希望使用快速 SSD 磁盘作为缓存或希望将所有构建处理数据存储在一个位置时非常有用。--config-create和--config— 这些选项允许您通过配置文件传递上述参数。 第一个选项将根据当前参数创建一个配置文件;第二个选项用于从该文件加载参数。--eXtensions (-x)— 安装并启用指定的插件。插件通过其 ID 指定,您可以在 JetBrains Marketplace的插件页面上找到:找到所需插件并滚动到 概览 选项卡的底部。
例如, JetBrains 的 StyleCop 插件的插件 ID 是
StyleCop.StyleCop,若要使用此插件运行 InspectCode,您需要将-x=StyleCop.StyleCop添加到命令行。要指定多个插件,请用分号分隔它们的 ID。
--source— 允许您指定自定义包源以安装插件,即包含插件的 .nupkg 文件所在的目录,例如:--source="C:\plugins"。 如果未指定任何内容,InspectCode 将在 JetBrains Marketplace 中查找插件。--measure— 一个诊断选项,如果您在特定硬件和目标解决方案上运行工具时遇到性能问题,可以帮助您。 使用此选项和以下参数之一[sampling | timeline (Windows-only) | memory]定义分析类型,例如:InspectCode.exe YourSolution.sln -o=<PathToOutputFile>执行完成后,除了问题报告文件外,InspectCode 还会创建一个执行快照并显示快照文件的路径。 您可以使用 JetBrains 工具研究快照:
采样或 时间线分析:要分析生成的 .zip 文件,请解压并使用 JetBrains dotTrace打开采样快照文件( .dtp )或时间线快照文件( .dtt )。
内存分析:要分析生成的 dotMemory 工作区文件( .dmw ),请使用 JetBrains dotMemory打开它。
--version (-v)— 使用此选项显示工具的当前版本并退出。--no-updates— 默认情况下,InspectCode 在每次运行时检查更新。 使用此选项禁用更新检查。
控制 ReSharper 设置的参数
--settings— 默认情况下,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 已经安装在您的机器上,并且通常存在多个安装,因此您需要提供一个适合目标解决方案的版本。
在大多数情况下,您只需添加一个参数 — --toolset 或 --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 版本。
项目引用。 可能的问题和解决方案
MSBuild 也被 InspectCode 用于解析引用项目和程序集中的符号。 有两个项目属性允许根据环境使用不同的引用: 平台 和 配置。 如果运行 InspectCode 的环境与项目最后一次构建的环境不同,您可能会收到类似于 无法解析引用 XXX:MsBuild 未能解析该引用 或 无法解析此引用。 无法找到程序集“XXX” 的错误。
如果您收到此类错误,请检查输出以查看构建配置是否存在不匹配。 例如,
在上述示例中,您可以看到项目文件中指定的平台是 x86 ,但工具正在 64 位模式下运行。 要解决此问题,请使用 --properties 参数显式指定目标平台和配置: --properties:Platform=x64;Configuration=Debug。
在 InspectCode 中使用 ReSharper 扩展
某些 ReSharper 扩展提供了额外的 代码检查 ,允许您发现代码中更多潜在问题。 这些扩展也可以与 InspectCode 一起使用。
通过 InspectCode 运行来自 ReSharper 扩展的额外代码检查
找到包含 一个 ReSharper 扩展的 NuGet 包 .nupkg 。 您可以从 JetBrains Marketplace 获取它,或者按照 ReSharper 开发指南 中的描述为您自己的扩展创建它。
将此 .nupkg 文件复制到 InspectCode.exe 所在的目录。
运行 InspectCode。 它会自动检测目录中所有带有 ReSharper 扩展的 NuGet 包并加载它们。
支持的语言
InspectCode 在以下语言中发现代码问题: