Visual studio 2012 在Microsoft Visual Studio 2012中禁用解决方案级别的代码分析
在我们的产品中,大约有400个项目,所以在VS 2012中,如果我想进行构建,那么它会为所有400个项目生成代码分析,并且我不能手动禁用每个项目的代码分析。因此,我正在寻找一种机制,它可以禁用整个解决方案(所有项目)的代码分析,而不是将这些设置应用于单个项目。不确定VS2012是否有一种简单的方法。代码分析是在项目级别定义的,取决于您的构建配置。例如,版本中没有代码分析 首先,尝试创建基于发布的配置 另一个解决方案(但非常糟糕)可能是运行批处理来修改所有项目文件 下面是一个示例项目文件(检查名为RunCodeAnalysis的元素):Visual studio 2012 在Microsoft Visual Studio 2012中禁用解决方案级别的代码分析,visual-studio-2012,Visual Studio 2012,在我们的产品中,大约有400个项目,所以在VS 2012中,如果我想进行构建,那么它会为所有400个项目生成代码分析,并且我不能手动禁用每个项目的代码分析。因此,我正在寻找一种机制,它可以禁用整个解决方案(所有项目)的代码分析,而不是将这些设置应用于单个项目。不确定VS2012是否有一种简单的方法。代码分析是在项目级别定义的,取决于您的构建配置。例如,版本中没有代码分析 首先,尝试创建基于发布的配置 另一个解决方案(但非常糟糕)可能是运行批处理来修改所有项目文件 下面是一个示例项目文件(检查名为
真的
满的
假的
bin\Debug\
调试;痕迹
促使
4.
假的
pdbonly
真的
bin\Release\
痕迹
促使
4.
您可以编写一个小型控制台应用程序,从解决方案文件中读取所有项目文件,然后切换每个项目的Xml节点
用于从解决方案中获取项目文件的函数:
您可以使用一个小技巧来禁用整个VisualStudio实例的静态代码分析,如下所述。简言之:
- 打开VS2012的开发者命令提示符
- 类型
set DevDivCodeAnalysisRunType=已禁用
- 键入
启动Visual Studiodevenv
同样的解决方案也适用于Visual Studio 2015,通过VS2015的开发者命令提示符您可以使用Nuget的Package Manager控制台窗口来实现这一点 在名为“NuGet_profile.ps1”的目录“C:\Users{your user}\Documents\WindowsPowerShell”中创建一个新的文本文件,并添加以下代码:
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);
}
重新启动VisualStudio。单击菜单“查看”|“其他窗口”|“软件包管理器控制台”。现在,您可以执行以下命令:
> Enable-CodeAnalysis
> Disable-CodeAnalysis
要禁用特定项目的代码分析,请执行以下操作:-
所有这些项目都在一个解决方案中吗?是的,因为我们还将单元测试用例与它们结合在一起。对于framework 3.5,文件中有一个名为“Microsoft.Common.targets”的选项,即RunCodeAnalysis(可以设置为False),但对于framework 4.0,没有这样的选项……大约10秒左右,因为VS2012现在快多了。但是,你能提供一些关于禁用所有项目的代码分析的信息吗?十秒钟?我不相信你。在任何情况下,我认为其他答案都是正确的:没有办法做到这一点。谢谢回答。。。但我知道在项目级别的更改,但我想在解决方案级别禁用相同的更改,或者说在一个设置中对所有项目禁用相同的更改。。。
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);
}
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);
}
> Enable-CodeAnalysis
> Disable-CodeAnalysis