Due to issues with merging etc, we have lots of project files that don’t contain all source code files that are within their folders.
Before I write a little tool, that
In my search for a solution for this, I ran into this VS Extension, but it only works with VS 2012. It's also on Github.
For VS 2013+ I use a Powershell script found on this blog post. Note that it only works for C# projects, but you can modify it for VB projects.
#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 ##############'
Example usage (should be run from the NuGet console):
./FindProjectMissingFiles.ps1 -s $dte.Solution.FileName
I wrote a tool for this some time ago. Available here.
Another possibility: Sometimes the file is selectively not added to the source control. To resolve this, right-click the project and select "Add Items to Folder".
Any files not shown in the source control explorer that you see in their source folders should be here and can be selectively added.
I've found the "Show missing files for VS 2019" Visual Studio extension. It will show the list both missing and not referenced from project files in the "Error list" window after the build.
For the older Visual Studio use "Show missing files for VS 2013-2017" extension.
None of the previous solutions worked for me as the project I was attempting to add files to was a "Web Site Project"(WSP). When selecting the project in the solution explorer the "Project" menu item converted to "Website" and there was no "Show all Files" option.
This is because for WSP(link):
"all files are already shown in the Solution Explorer."
Except in my case they weren't... I resolved the issue by simply closing and reopening Visual Studio 2015(VS) and reloading the project. I think VS only detects the addition of new files when the Web Site is re-loaded, not when those files are added outside of VS.
After reading there is no generic solution for this here on Stack Overflow, I created a NodeJS module this weekend to solve this problem:
https://www.npmjs.com/package/check-vs-includes
This is pretty generic, so I hope this helps others as well. It saves me a manual check of over 70 folders (500+ files) on every deploy. If I have some time I hope to improve some things, like documentation... But let me give a simple example right now.
Simple example
npm install check-vs-includes
For instance add a gulpfile.js
to your project:
gulp.task('checkVSIncludes', function(cb) {
checkVSIncludes(['/Content/**/*.less', '/app/**/*.js']);
});
This example checks that all .js
and .less
files in the specified folders are included in your project file. Notice that you can use glob's.
gulp checkVSIncludes
Check the source code for more options, it's all on GitHub (contributions are welcome ;)).