在 TFS 构建中的 ReSharper 代码质量分析中使用自定义模式

Use Custom Patterns in ReSharper Code Quality Analysis in TFS build

我在开发机器上使用 ReSharper 2017.2.2 和 Visual Studio 2017.5。

我正在使用 TFS 2017 更新 3。

在TFS服务器上,安装了Visual Studio2017.4和ReSharper CLT 2017.2.2。

我正在使用 TFS 构建。

我的目标是在构建解决方案时进行代码分析。

我使用 Resharper 代码质量分析任务。我可以使用位于解决方案根目录的 sln.DotSettings 文件对其进行配置。

标准代码检查 ReSharper 是否成功运行。我还可以更改警告级别,如此处所示 https://marketplace.visualstudio.com/items?itemName=alanwales.resharper-code-analysis

为此我使用 ReSharper -> Options | Code Inspection -> Custom patterns

此规则在 Visual Studio 中运行良好。当我将此规则保存到 sln.DotSettings 时,添加了以下行:

 <s:Boolean x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=4E6B3830DEEA6148909C23CD21C96E28/@KeyIndexDefined">True</s:Boolean>
 <s:String x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=4E6B3830DEEA6148909C23CD21C96E28/LanguageName/@EntryValue">JAVA_SCRIPT</s:String>
 <s:Boolean x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=4E6B3830DEEA6148909C23CD21C96E28/MatchCatchClauseWithoutExceptionFilter/@EntryValue">False</s:Boolean>
 <s:String x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=4E6B3830DEEA6148909C23CD21C96E28/SearchPattern/@EntryValue">debugger</s:String>
 <s:String x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=4E6B3830DEEA6148909C23CD21C96E28/Severity/@EntryValue">ERROR</s:String></wpf:ResourceDictionary>

我在JS代码中特地加了debugger行。但是我的自定义模式没有收到警告。

TFS 中的 Resharper 代码质量分析支持是否使用自定义模式?

更新 1:我使用以下命令通过控制台检查了代码分析的启动:InspectCode.exe -o="C:\temp\Results.xml" --no-swea "C:\BuildAgent\Thompson\_work\s\***.sln"

在 Results.xml 文件中,我找到了所需的行:

<Issue TypeId="StructuralSearch" Severity="ERROR" File="***.WebResources\WebResources\new_\js\forms\***.js" Offset="406-415" Line="13" Message="debugger" />

更新 2:我查看了脚本代码 RunResharperCodeAnalysisTool.ps1。在这个文件中有以下几行:

...
$severityLevels = @{"Hint" = 0; "Suggestion" = 1; "Warning" = 2; "Error" = 3}
...
foreach($issue in $issuesElements) {
    $severity = @($issuesTypesElements | Where-Object {$_.Attributes["Id"].Value -eq $issue.Attributes["TypeId"].Value})[0].Attributes["Severity"].Value

    $severityLevel = $severityLevels[$severity]

    if($severityLevel -ge $severityLevels[$failBuildLevelSelector]) {
        $item = New-Object -TypeName PSObject -Property @{
            'Severity' = $severity
            'Message' = $issue.Attributes["Message"].Value
            'File' = $issue.Attributes["File"].Value
            'Line' = $issue.Attributes["Line"].Value
        }

        $filteredElements.Add($item)
    }
}

Results.xml 文件有以下几行:

<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by JetBrains Inspect Code 2017.2.2 -->
<Report ToolsVersion="109.0.20171006.123742">
  <Information>
    <Solution>..\..\BuildAgent\Thompson\_work\s\***\***.sln</Solution>
    <InspectionScope>
      <Element>Solution</Element>
    </InspectionScope>
  </Information>
  <IssueTypes>   
    <IssueType Id="StructuralSearch" Category="Structural Search Highlightings" CategoryId="StructuralSearch" Description="Structural Search Pattern" Severity="INVALID_SEVERITY" />    
    <IssueType Id="WebConfigErrors" Category="WebConfig Errors" CategoryId="WebConfigErrors" Description="" Severity="ERROR" />
  </IssueTypes>
  <Issues>
    <Project Name="***">
      <Issue TypeId="WebConfigErrors" File="***.WebResources\Web.config" Offset="531-650" Line="17" Message="Invalid module qualification: Failed to resolve assembly Microsoft.CodeDom.Providers.DotNetCompilerPlatform" />
      <Issue TypeId="WebConfigErrors" File="***.WebResources\Web.config" Offset="916-1035" Line="20" Message="Invalid module qualification: Failed to resolve assembly Microsoft.CodeDom.Providers.DotNetCompilerPlatform" />
      <Issue TypeId="StructuralSearch" Severity="ERROR" File="***.WebResources\WebResources\new_\js\forms\***.js" Offset="406-415" Line="13" Message="debugger" />
    </Project>
  </Issues>
</Report>

我的自定义模式有 Severity="INVALID_SEVERITY" 不在 $severityLevels 列表中。

由于它在命令行下运行良好,看来问题与 TFS 端无关,可能与 3 方任务更相关。

如果这不适用于 Resharper Code Quality Analysis 任务,您可以在构建任务期间通过使用命令行任务或自定义扩展直接调用 InspectCode.exe 命令。然后将结果文件发布到TFS。

此外,作为一种解决方法,您还可以使用 logging commands 从您的 powershell 脚本中 return 警告和错误。使用 task.logissue type=error 可能会使构建任务失败,然后导致构建失败。