在我们的产品中,大约有 400 个项目,所以在 VS 2012 中,如果我想进行构建,那么它会为所有 400 个项目生成代码分析,我不能手动禁用每个项目的代码分析。所以我正在寻找一种机制来禁用整个解决方案(所有项目)的代码分析,而不是将这些设置应用于单个项目。
5 回答
您可以使用一个小技巧来禁用整个 Visual Studio 实例的静态代码分析,如此处所述。简而言之:
- 打开一个
Developer Command Prompt for VS2012
- 类型
set DevDivCodeAnalysisRunType=Disabled
- 键入
devenv
以启动 Visual Studio
相同的解决方案适用于 Visual Studio 2015,通过Developer Command Prompt for VS2015
.
您可以编写一个小控制台应用程序,从解决方案文件中读取所有项目文件,然后切换每个项目的 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);
}
不确定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>
您可以使用 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
禁用特定项目的代码分析:-
- 右键单击项目,选择属性。
- 在属性页面上选择代码分析。
- 取消选中“在构建时启用代码分析”复选框。