12

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

4

5 回答 5

28

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

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

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

于 2014-02-24T08:14:54.190 回答
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);
}
于 2013-05-13T21:24:52.777 回答
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>
于 2013-01-28T10:37:43.900 回答
4

您可以使用 Nuget 的包管理器控制台窗口来执行此操作。

在目录“C:\Users{your user}\Documents\WindowsPowerShell”中创建一个名为“NuGet_profile.ps1”的新文本文件,并添加以下代码:

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。点击菜单“查看”| “其他窗口” | “包管理器控制台”。现在您可以执行以下命令:

> Enable-CodeAnalysis
> Disable-CodeAnalysis
于 2015-04-29T11:12:00.257 回答
0

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

  1. 右键单击项目,选择属性。
  2. 在属性页面上选择代码分析。
  3. 取消选中“在构建时启用代码分析”复选框。
于 2017-07-26T12:22:22.493 回答