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