在Microsoft Visual Studio 2012中禁用解决方案级别的代码分析

时间:2013-01-28 08:48:55

标签: visual-studio-2012

在我们的产品中,大约有400个项目,所以在VS 2012中,如果我想进行构建,那么它会为所有400个项目生成代码分析,并且我无法手动禁用每个项目的代码分析。每个项目。所以我正在寻找一种机制来禁用整个解决方案(所有项目)的代码分析,而不是将这些设置应用于单个项目。

5 个答案:

答案 0 :(得分:27)

您可以使用一个小技巧来禁用整个Visual Studio实例的静态代码分析,如here所述。简而言之:

  • 打开Developer Command Prompt for VS2012
  • 输入set DevDivCodeAnalysisRunType=Disabled
  • 键入devenv以启动Visual Studio

相同的解决方案适用于Visual Studio 2015,Developer Command Prompt for VS2015

答案 1 :(得分:4)

不确定VS2012是否容易实现。 CodeAnalysis在项目级别定义,取决于您的构建配置。例如,Release中没有代码分析。

首先,尝试基于Release创建配置。

另一个解决方案(但非常糟糕)可能是运行批处理来修改所有项目文件。

这是一个示例项目文件(检查名为 RunCodeAnalysis 的元素):

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <RunCodeAnalysis>false</RunCodeAnalysis>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>

答案 2 :(得分:4)

您可以编写一个小的控制台应用程序,从解决方案文件中读取所有项目文件,然后切换每个项目的Xml节点。

从解决方案中获取项目文件的功能:

public IEnumerable<string> Parse(string solutionFile)
{
    if (solutionFile == null)
        throw new ArgumentNullException("solutionFile");

    if (!File.Exists(solutionFile))
        throw new FileNotFoundException("Solution file does not exist", solutionFile);

    var projectFiles = new List<string>();

    using (var reader = new StreamReader(solutionFile, true))
    {
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            if (line == null)
                continue;

            line = line.TrimStart();
            if (!line.StartsWith("Project(", StringComparison.OrdinalIgnoreCase)) 
                continue;

            var projectData = line.Split(',');
            var projectFile = projectData[1].Trim().Trim('"');
            if (!string.IsNullOrEmpty(Path.GetExtension(projectFile)))
                projectFiles.Add(projectFile);
        }
    }

    return projectFiles;
}

以及切换RunCodeAnalysis节点的功能:

public void ToggleCodeAnalysis(string projectFile)
{
    if (projectFile == null)
        throw new ArgumentNullException("projectFile");

    if (!File.Exists(projectFile))
        throw new FileNotFoundException("Project file does not exist", projectFile);

    var xmlDocument = new XmlDocument();
    xmlDocument.Load(projectFile);

    var namespaceManager = new XmlNamespaceManager(xmlDocument.NameTable);
    namespaceManager.AddNamespace("ns", "http://schemas.microsoft.com/developer/msbuild/2003");

    var nodes = xmlDocument.SelectNodes("//ns:RunCodeAnalysis", namespaceManager);
    if (nodes == null)
        return;

    var hasChanged = false;
    foreach (XmlNode node in nodes)
    {
        bool value;
        if (!Boolean.TryParse(node.InnerText, out value))
            continue;

        node.InnerText = value ? "false" : "true";
        hasChanged = true;
    }

    if (!hasChanged)
        return;

    xmlDocument.Save(projectFile);
}

答案 3 :(得分:4)

您可以使用Nuget的Package Manager控制台窗口来执行此操作。

在目录&#34; C:\ Users {your user} \ Documents \ WindowsPowerShell&#34;中创建一个新的文本文件。命名&#34; NuGet_profile.ps1&#34;并添加以下代码:

function Disable-CodeAnalysis(){
  ForEach ($project in $dte.Solution.Projects) {
    Set-CodeAnalysis($project, $false)
  }
}

function Enable-CodeAnalysis(){
  ForEach ($project in $dte.Solution.Projects) {
    Set-CodeAnalysis($project, $true)
  }
}

function Set-CodeAnalysis($project, $value){
  $projectName = $project.Name
  $projectFilePath = $project.FullName
  if ([System.String]::IsNullOrWhiteSpace($projectFilePath)){
    if($proj.Kind -eq "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}"){
      ForEach ($item in $proj.ProjectItems) {
        if($item.SubProject -ne $null){
          Set-CodeAnalysis($item.SubProject, $value)
        }
      }
    }
    continue;
  }
  $xmlDocument = new-object System.Xml.XmlDocument
  $action = "Enable"
  if($value -ne $true){
    $action = "Disable"
  }

  Write-Host "$action code analysis for $projectName at $projectFilePath"
  $xmlDocument.Load([string]$projectFilePath);

  $namespaceManager = new-object System.Xml.XmlNamespaceManager($xmlDocument.NameTable);
  $namespaceManager.AddNamespace("ns", "http://schemas.microsoft.com/developer/msbuild/2003");

  $nodes = $xmlDocument.SelectNodes("//ns:RunCodeAnalysis", $namespaceManager);
  if ($nodes -eq $null){
    continue;
  }
  foreach ($node in $nodes){
    $node.InnerText = "$value";
  }
  $xmlDocument.Save($projectFilePath);
}

重新启动Visual Studio。点击菜单&#34;查看&#34; | &#34;其他Windows&#34; | &#34;包管理器控制台&#34;。现在您可以执行以下命令:

> Enable-CodeAnalysis
> Disable-CodeAnalysis

答案 4 :(得分:0)

禁用特定项目的代码分析: -

  1. 右键单击Project,选择Properties。
  2. 在属性页面上选择代码分析。
  3. 取消选中“在构建时启用代码分析”复选框。