Подтвердить что ты не робот

Как найти файлы, отсутствующие в проектах визуальной студии?

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

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

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

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

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

4b9b3361

Ответ 1

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

  • Выберите проект в панели обозревателя решений
  • Меню проекта → Показать все файлы
  • В рамках проекта файлы, которые не являются частью проекта, будут отображаться как значки "призрак"
  • Выберите нужный файл и выберите "Включить в проект" из контекстного меню

Ответ 3

После прочтения нет общего решения для этого здесь в Stack Overflow, я создал модуль NodeJS в эти выходные, чтобы решить эту проблему:

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

Это довольно общий характер, поэтому я надеюсь, что это поможет и другим. Это экономит мне ручную проверку более 70 папок (более 500 файлов) при каждом развертывании. Если у меня есть некоторое время, я надеюсь улучшить некоторые вещи, например документацию... Но позвольте мне привести простой пример прямо сейчас.

Простой пример

  • Установите nodeJS (отлично работает и в Windows)
  • npm install check-vs-includes

  • Добавьте к нему задачу и укажите файлы для проверки.

Например, добавьте gulpfile.js к вашему проекту:

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

В этом примере проверяется, что все файлы .js и .less в указанных папках включены в ваш файл проекта. Обратите внимание, что вы можете использовать glob.

  1. Запустите проверку; для примера GULP:

    gulp checkVSIncludes

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

Ответ 4

В моем поиске решения для этого я столкнулся с this VS Extension, но он работает только с VS 2012. Это также на Github.

Для VS 2013+ я использую Powershell script, найденный на этом сообщении в блоге. Обратите внимание, что он работает только для проектов С#, но вы можете изменить его для проектов 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

Ответ 5

Небольшое консольное приложение С#, которое находит все файлы 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();
        }
    }
}

Ответ 6

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

Это связано с тем, что для WSP (ссылка):

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

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

Ответ 7

У нас была аналогичная ситуация, в результате которой произошел сбой компиляции из-за отсутствия файлов. Я наткнулся на эту запись, связанную ниже, что помогло мне. В нем описывается запись макроса Visual Studio, который запускается при запуске сборки.

Сообщить об ошибке/предупреждение при отсутствии файлов в проекте/решении в Visual Studio

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

некоторые из моих файлов и папок не отображаются в visual studio. даже не в проекте. Но все файлы отображаются в коммите. Есть ли решение для восстановления

Ответ 12

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