4

在我的构建上启用静态代码分析时,我收到 MSBuild 引发的以下错误:

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\Microsoft.CSharp.CurrentVersion.targets(134,9):警告 MSB3884:找不到规则集文件“AllRules.ruleset” . [C:\Program Files\VSTS Agent_work\PATH_TO_MY.csproj]

要让静态代码分析在构建代理(只有 MSBuild,没有 Visual Studio)上工作,对于旧版本的构建工具,我们应该:

  1. 复制C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\Rule Sets\到构建服务器
  2. 添加指向该文件夹的注册表项

(另请参阅此错误报告

但是,这些说明不适用于"Build Tools for Visual Studio 2017"。我想知道如何解决这个问题,而不需要将规则集复制到我自己的存储库或更改我的 csproj 中的任何内容?

更新:

我尝试设置以下注册表项,但无济于事:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\15.0\Setup\EDev]
"StanDir"="C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\Team Tools\\Static Analysis Tools"

通过注册表挖掘,我发现了以下注册表项。在我的机器上,我已经安装了 VS2017 Build Tools 和 Test Agent,这似乎指向后者,这是我在安装 Build Tools 后安装的:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7]
"15.0"="C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\TestAgent\\"
"14.0"="C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\"

更新 2:
两个答案都提到了 file Microsoft.CodeAnalysis.Targets。但是,我的构建服务器上不存在此文件。我尝试从我的 VS2017 安装中复制此文件夹:

from: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\VisualStudio\v15.0\CodeAnalysis
to: C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\CodeAnalysis

但是,除了找不到规则集之外,它现在还会引发有关无法找到的错误Microsoft.WebApplication.targets

XXX.csproj(296,11):错误 MSB4226:导入的项目“C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuil d\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.目标”没有找到。此外,尝试在 $(VSToo lsPath) 的后备搜索路径中找到 "WebApplications\Microsoft.WebApplication.targets" - "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v15.0" 。这些搜索路径在“C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe.Config”中定义。确认声明中的路径正确,并且该文件存在于磁盘上的搜索路径之一中。

4

2 回答 2

4

更新:

根据我的测试,您不需要手动更改任何内容,只需要安装 VS2017 的 Build Tools 的默认组件,然后会自动添加必要的文件。

在此处输入图像描述

老的:

关于代码分析文件的默认文件夹,您可以查看 Microsoft.CodeAnalysis.targets 文件:

<PropertyGroup>
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'=='' and Exists('$(VsInstallRoot)\Team Tools\Static Analysis Tools\')">$(VsInstallRoot)\Team Tools\Static Analysis Tools\</CodeAnalysisStaticAnalysisDirectory>
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'==''">$(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\15.0\Setup\EDev@StanDir)</CodeAnalysisStaticAnalysisDirectory>
    <!-- If we didn't find the first registry path, assume we're in a 64bit process. -->
    <!-- read registry from Wow6432Node -->
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'==''">$(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\15.0\Setup\EDev@StanDir)</CodeAnalysisStaticAnalysisDirectory>

    <!-- if we didn't find the registry path yet, then try Win8 Express location -->
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'==''">$(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VSWinExpress\15.0\Setup\EDev@StanDir)</CodeAnalysisStaticAnalysisDirectory>
    <!-- If we didn't find the registry path yet, then try Win8 Express 64-bit location -->
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'==''">$(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VSWinExpress\15.0\Setup\EDev@StanDir)</CodeAnalysisStaticAnalysisDirectory>

    <!-- If we didn't find the registry path yet, try WP Express locations -->
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'==''">$(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VPDExpress\15.0\Setup\EDev@StanDir)</CodeAnalysisStaticAnalysisDirectory>
    <!-- If we didn't find the registry path yet, try WP Express 64-bit locations -->
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'==''">$(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VPDExpress\15.0\Setup\EDev@StanDir)</CodeAnalysisStaticAnalysisDirectory>

    <!-- If we didn't find the registry path yet, try WD Express locations -->
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'==''">$(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\WDExpress\15.0\Setup\EDev@StanDir)</CodeAnalysisStaticAnalysisDirectory>
    <!-- If we didn't find the registry path yet, try WD Express 64-bit locations -->
    <CodeAnalysisStaticAnalysisDirectory Condition="'$(CodeAnalysisStaticAnalysisDirectory)'==''">$(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WDExpress\15.0\Setup\EDev@StanDir)</CodeAnalysisStaticAnalysisDirectory>

    <!-- Default rule set search paths -->
    <CodeAnalysisRuleSetDirectories Condition=
            "'$(CodeAnalysisIgnoreBuiltInRuleSets)'!='true' and
             '$(CodeAnalysisStaticAnalysisDirectory)'!=''">$(CodeAnalysisRuleSetDirectories);$(CodeAnalysisStaticAnalysisDirectory)\Rule Sets</CodeAnalysisRuleSetDirectories>

    <!-- 
         In scenario where we run CA from command-line , we don't get "CodeAnalysisVSSku" variable passed by the IDE, so in case of Express-only installation
         we attempt to load rule sets that are only present on Pro and above - and fail. Let's assume we're in "Express" mode if the Pro+ rule set doesn't exist.
     -->
    <CodeAnalysisVSSku Condition="'$(CodeAnalysisVSSku)'=='' and !Exists('$(CodeAnalysisStaticAnalysisDirectory)\Rule Sets\NativeRecommendedRules.ruleset')">Express</CodeAnalysisVSSku>
  </PropertyGroup>

根据代码,您只需将代码分析规则文件放在$(VsInstallRoot)\Team Tools\Static Analysis Tools文件夹中,如果您只是在构建服务器上安装 Build Tools for Visual Studio 2017,则$(VsInstallRoot)值为C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools

总而言之,您只需要将规则文件放在C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Team Tools\Static Analysis Tools文件夹中。

于 2017-11-15T07:47:59.497 回答
2

正式地,您需要将 Visual Studio 安装到构建服务器上,因为来自这些规则的代码分析是 Visual Studio 的一部分,而不是 MsBuild。

您仍然可以将静态分析目录复制到您的构建服务器,并在 Additional Arguments 选项中向 MsBuild 提供以下参数:

/p:CodeAnalysisStaticAnalysisDirectory=c:\analysisdirectory

或者只复制规则文件并指定此 MsBuild 参数,当您将规则文件放入源代码控制时,这可能是最简单的:

/p:CodeAnalysisRuleDirectories=c:\analysisdirectory\rules

或者,您可以编辑项目文件并在属性组中设置属性。

于 2017-11-14T22:10:05.823 回答