如何查找Visual Studio项目中缺less的文件?

由于合并等问题,我们有很多项目文件不包含在其文件夹内的所有源代码文件。

在我编写一个小工具之前,它会检查每个*.cs文件是否包含在项目文件中,我希望确保之前没有其他的主体已经完成。

(我们有近100个项目文件,和1000个C#文件)

——————-

很显然,Visual Studio现在使用通配符来包含项目中给定目录中的所有“* .cs”文件是对此问题的最佳解决scheme。 在那里,当“.cs”文件被添加时,不需要更新项目文件,重命名为ete。 然而,只有在VS2017中,这从UI中变得可用。

有了这些文件和项目,听起来你可能想要更自动的东西。 但是,有一个手动方法(不知道你是否已经意识到):

  1. 在解决scheme浏览器窗格中select项目
  2. 项目菜单 – >显示所有文件
  3. 在该项目下,不属于该项目的文件将显示为“鬼”图标
  4. select你想要的文件,并从上下文菜单中select“Include In Project”

阅读后没有通用的解决scheme在这里堆栈溢出,我创build了一个NodeJS模块这个周末来解决这个问题:

https://www.npmjs.com/package/check-vs-includes

这是非常通用的,所以我希望这也可以帮助其他人。 它省去了我每次部署时超过70个文件夹(500多个文件)的手动检查。 如果我有一些时间,我希望能够改进一些东西,比如文档…但现在让我举个简单的例子。

简单的例子

  1. 安装nodeJS (在Windows上也很好用)
  2. npm install check-vs-includes

  3. 为它添加一个任务并指定要检查的文件。

例如添加一个gulpfile.js到你的项目中:

 gulp.task('checkVSIncludes', function(cb) { checkVSIncludes(['/Content/**/*.less', '/app/**/*.js']); }); 

本示例检查指定文件夹中的所有.js.less文件是否包含在项目文件中。 注意你可以使用glob的。

  1. 运行检查; 对于GULP的例子:

    gulp checkVSIncludes

检查源代码的更多选项,这一切都在GitHub上 (欢迎贡献;))。

我发现“ 显示缺less的文件 ”Visual Studio扩展。 它将在构build之后在“错误列表”窗口中显示丢失文件的列表。

在我寻找一个解决scheme,我遇到了这个 VS扩展,但它只适用于VS 2012 。 这也在Github上 。

对于VS 2013+,我使用本博客文章中的Powershell脚本。 请注意,它只适用于C#项目,但您可以修改它的VB项目。

 #Author: Tomasz Subik http://tsubik.com #Date: 8/04/2012 7:35:55 PM #Script: FindProjectMissingFiles #Description: Looking for missing references to files in project config file Param( [parameter(Mandatory=$false)] [alias("d")] $Directory, [parameter(Mandatory=$false)] [alias("s")] $SolutionFile ) Function LookForProjectFile([System.IO.DirectoryInfo] $dir){ [System.IO.FileInfo] $projectFile = $dir.GetFiles() | Where { $_.FullName.EndsWith(".csproj") } | Select -First 1 if ($projectFile){ $projectXmlDoc = [xml][system.io.file]::ReadAllText($projectFile.FullName) #[xml]$projectXmlDoc = Get-Content $projectFile.FullName $currentProjectPath = $projectFile.DirectoryName+"\" Write-Host "----Project found: " $projectFile.Name $nm = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $projectXmlDoc.NameTable $nm.AddNamespace('x', 'http://schemas.microsoft.com/developer/msbuild/2003') [System.Collections.ArrayList]$filesListedInProjectFile = $projectXmlDoc.SelectNodes('/x:Project/x:ItemGroup/*[self::x:Compile or self::x:Content or self::x:None]/@Include', $nm) | Select-Object Value CheckProjectIntegrity $dir $currentProjectPath $filesListedInProjectFile; } else { $dir.GetDirectories() | ForEach-Object { LookForProjectFile($_); } } } Function CheckProjectIntegrity([System.IO.DirectoryInfo] $dir,[string] $currentProjectPath, [System.Collections.ArrayList] $filesListedInProjectFile ){ $relativeDir = $dir.FullName -replace [regex]::Escape($currentProjectPath) $relativeDir = $relativeDir +"\" #check if folder is bin obj or something if ($relativeDir -match '(bin\\|obj\\).*') { return } $dir.GetFiles() | ForEach-Object { $relativeProjectFile = $_.FullName -replace [regex]::Escape($currentProjectPath) $match = $false if(DoWeHaveToLookUpForThisFile($relativeProjectFile)) { $idx = 0 foreach($file in $filesListedInProjectFile) { if($relativeProjectFile.ToLower().Trim() -eq $file.Value.ToLower().Trim()){ $match = $true break } $idx++ } if (-not($match)) { Write-Host "Missing file reference: " $relativeProjectFile -ForegroundColor Red } else { $filesListedInProjectFile.RemoveAt($idx) } } } #lookup in sub directories $dir.GetDirectories() | ForEach-Object { CheckProjectIntegrity $_ $currentProjectPath $filesListedInProjectFile } } Function DoWeHaveToLookUpForThisFile($filename) { #check file extensions if ($filename -match '^.*\.(user|csproj|aps|pch|vspscc|vssscc|ncb|suo|tlb|tlh|bak|log|lib|sdf)$') { return $false } return $true } Write-Host '######## Checking for missing references to files started ##############' if($SolutionFile){ [System.IO.FileInfo] $file = [System.IO.FileInfo] $SolutionFile $Directory = $file.Directory } LookForProjectFile($Directory) Write-Host '######## Checking for missing references to files ends ##############' 

用法示例(应该从NuGet控制台运行):

 ./FindProjectMissingFiles.ps1 -s $dte.Solution.FileName 

一个小型C#控制台应用程序,它可以从某个根文件夹(recursion)下的项目文件中查找所有的cs文件,并与同一根文件夹下的文件系统中的文件进行比较。 可以应用于不同的文件扩展名和不同的项目文件结构(我已经testing过VS2008)。 它可能需要一些修改来适应其他需求,但应该提供一个有用的基础。

 using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; namespace CompareProjectFilesWithFileSystem { class Program { static void Main(string[] args) { string ext = "cs"; string rootProjectFolder = @"C:\MySolutionRootFolder"; Regex projectFileReferenceRegEx = new Regex(@"<(Compile|Content|None) Include=\""([^\""]+." + ext + @")\""( /)?>"); // Files in file system: List<string> filesInFileSystem = new List<string>(); filesInFileSystem.AddRange(Directory.GetFiles(rootProjectFolder, "*." + ext, SearchOption.AllDirectories)); // Files referred from project files: string[] projectFilePaths = Directory.GetFiles(rootProjectFolder, "*.csproj", SearchOption.AllDirectories); List<string> filesReferredInProjectFiles = new List<string>(); foreach (string projectFilePath in projectFilePaths) { string[] lines = File.ReadAllLines(projectFilePath); foreach (string line in lines) { Match match = projectFileReferenceRegEx.Match(line); if (match.Success) { filesReferredInProjectFiles.Add(Path.Combine(Path.GetDirectoryName(projectFilePath), match.Result("$2"))); } } } // Finding files referred from project files that are not contained in file system. And reversely. var list1 = filesReferredInProjectFiles.Except(filesInFileSystem).ToList(); var list2 = filesInFileSystem.Except(filesReferredInProjectFiles).ToList(); } } } 

以前的解决scheme都不适合我,因为我试图添加文件的项目是“网站项目”(WSP)。 在解决scheme资源pipe理器中select项目时,“项目”菜单项转换为“网站”,没有“显示所有文件”选项。

这是因为对于WSP( 链接 ):

“所有文件已经在解决scheme资源pipe理器中显示”。

除了在我的情况下,他们不是…我通过简单地closures并重新打开Visual Studio 2015(VS)和重新加载项目来解决问题。 我认为VS只检测网站重新加载时添加新文件,而不是当这些文件添加到VS之外。

我们有类似的情况,导致由于缺less文件编译失败。 我偶然发现了这个链接,这对我有帮助。 它描述了编写构build开始时运行的Visual Studiomacros。

如果在Visual Studio中缺less项目/解决scheme中的文件,则报告错误/警告

(假定Team Foundation Server是您的源代码pipe理器):如果文件已添加到项目中并显示在源代码pipe理资源pipe理器中,但未显示在解决scheme资源pipe理器中,则必须手动将其添加到源代码pipe理资源pipe理器,方法是select“添加“,”现有项目“。 这是一个恼人的Visual Studio / TFS错误,我只花了2个小时试图找出。

我前一段时间写了一个工具。 可在这里 。

另一种可能性:有时文件有select地不添加到源代码pipe理。 要解决此问题,请右键单击该项目并select“将项目添加到文件夹”。

在源代码文件夹中看到的源代码pipe理资源pipe理器中未显示的任何文件都应在此处,并且可以select性地添加。