it-swarm.com.ru

Как найти файлы, которые отсутствуют в проектах Visual Studio?

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

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

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

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

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

39
Ian Ringrose

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

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

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

14
izogfif

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

9
Bart

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

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

Небольшое консольное приложение 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();
        }
    }
}
4
Jesper Mygind

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

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

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

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

2
David Rogers

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

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

0
JWiley

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

0
dmbreth

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

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

0
Andy S.

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

0
Roger