How do I find files that are missing from visual studio projects?

前端 未结 11 611
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-31 01:59

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

相关标签:
11条回答
  • 2021-01-31 02:15

    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
    
    0 讨论(0)
  • 2021-01-31 02:15

    I wrote a tool for this some time ago. Available here.

    0 讨论(0)
  • 2021-01-31 02:19

    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.

    0 讨论(0)
  • 2021-01-31 02:20

    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.

    0 讨论(0)
  • 2021-01-31 02:22

    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.

    0 讨论(0)
  • 2021-01-31 02:25

    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

    1. Install nodeJS (Works great on Windows too)
    2. npm install check-vs-includes

    3. Add a task for it and specify the files to check for.

    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.

    1. Run the check; for the GULP example:

      gulp checkVSIncludes

    Check the source code for more options, it's all on GitHub (contributions are welcome ;)).

    0 讨论(0)
提交回复
热议问题