Как найти файлы, которые отсутствуют в проектах Visual Studio? - PullRequest
43 голосов
/ 01 сентября 2011

Из-за проблем со слиянием и т. Д. У нас есть много файлов проектов, которые не содержат все файлы исходного кода, которые находятся в их папках.

Прежде чем я напишу небольшой инструмент, который проверяет, что каждый файл *.cs включен в файл проекта, я хочу убедиться, что никто другой еще не сделал этого раньше.

(у нас есть около 100 файлов проекта и 1000 файлов C #)

-------------------

Очевидно, что Visual Studio теперь поддерживает использование подстановочных знаков для включения всех файлов «* .cs» из данного каталога в проект, что является лучшим решением этой проблемы. В этом случае нет необходимости обновлять файлы проекта при добавлении файлов «.cs», переименованных в ete. Однако только в VS2017 это становится доступным из пользовательского интерфейса.

Ответы [ 11 ]

51 голосов
/ 01 сентября 2011

С таким количеством файлов и проектов звучит так, будто вам нужно что-то более автоматизированное.Однако существует ручной подход (не уверен, если вы уже знаете об этом):

  1. Выберите проект в панели обозревателя решений
  2. Меню проекта -> Показать все файлы
  3. В рамках проекта файлы, которые не являются частью проекта, будут отображаться как «призрачные» значки
  4. Выберите нужные файлы и выберите «Включить в проект» в контекстном меню
18 голосов
/ 06 октября 2016

Я обнаружил " Показать отсутствующие файлы " Расширение Visual Studio.После сборки будет отображен список отсутствующих файлов в окне «Список ошибок».

9 голосов
/ 12 июля 2015

После прочтения, здесь нет общего решения для этого здесь, в переполнении стека, я создал модуль 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 .

запустить проверку;для примера GULP:

gulp checkVSIncludes

Проверьте исходный код на наличие дополнительных параметров, все это на GitHub (вкладыдобро пожаловать;)).

7 голосов
/ 21 сентября 2015

В поисках решения для этого я столкнулся с этим 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
4 голосов
/ 29 января 2016

Небольшое консольное приложение C #, которое находит все файлы cs, указанные в файлах проекта в определенной корневой папке (рекурсивно), и сравнивает файлы в файловой системе в той же корневой папке.Может применяться к различным расширениям файлов и различным структурам файлов проекта (я проверил это для 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();
        }
    }
}
2 голосов
/ 26 мая 2016

Ни одно из предыдущих решений не работало для меня, так как проект, в который я пытался добавить файлы, был «Проект веб-сайта» (WSP). При выборе проекта в обозревателе решений пункт меню «Проект» преобразовывался в «Веб-сайт», и параметр «Показать все файлы» отсутствовал.

Это потому, что для WSP ( ссылка ):

"все файлы уже отображаются в обозревателе решений."

За исключением моего случая, они не были ... Я решил проблему, просто закрыв и снова открыв Visual Studio 2015 (VS) и перезагрузив проект. Я думаю, что VS обнаруживает добавление новых файлов только при повторной загрузке веб-сайта, а не когда эти файлы добавляются за пределы VS.

0 голосов
/ 13 октября 2018

Если у кого-то есть ошибка «Файл не включен», первый ответ от 2011 года по-прежнему работает на VS 2017 версии 15.8.5 в .NET Framework версии 4.7.03056 Windows 10 с последними обновлениями.Закрытие и повторное открытие VS показывает все файлы.

0 голосов
/ 06 марта 2017

Другая возможность: иногда файл выборочно не добавляется в систему контроля версий.Чтобы решить эту проблему, щелкните правой кнопкой мыши проект и выберите «Добавить элементы в папку».

Любые файлы, не отображаемые в проводнике контроля версий, которые вы видите в их исходных папках, должны быть здесь и могут быть добавлены по выбору.

0 голосов
/ 16 декабря 2016

Я написал инструмент для этого некоторое время назад.В наличии здесь .

0 голосов
/ 23 января 2014

(Предполагается, что Team Foundation Server является вашим источником управления): если файл был добавлен в проект и обнаружен в Обозревателе управления источниками, но НЕ отображается в Обозревателе решений, необходимо вручную добавить его в Обозреватель управления источникамивыбрав «Добавить», «Существующий элемент».Это досадная ошибка Visual Studio / TFS, которую я потратил 2 часа, пытаясь выяснить.

...