Как найти файлы, отсутствующие в проектах визуальной студии?
Из-за проблем со слиянием и т.д. У нас есть много файлов проектов, которые не содержат все файлы исходного кода, которые находятся в их папках.
Прежде чем я напишу небольшой инструмент, который проверяет, что каждый файл *.cs
включен в файл проекта, я хочу убедиться, что никто другой еще не сделал этого раньше.
(У нас есть около 100 файлов проекта и 1000 файлов С#)
-------------------
Очевидно, что Visual Studio теперь поддерживает использование подстановочных знаков для включения всех файлов "*.cs" из заданного каталога в проект, что является лучшим решением этой проблемы. В этом случае нет необходимости обновлять файлы проекта при добавлении файлов .cs, переименованных в ete. Однако только в VS2017 это становится доступным из пользовательского интерфейса.
Ответы
Ответ 1
С таким количеством файлов и проектов кажется, что вам может понадобиться что-то более автоматизированное. Однако есть ручной подход (не уверен, что вы уже знаете об этом):
- Выберите проект в панели обозревателя решений
- Меню проекта → Показать все файлы
- В рамках проекта файлы, которые не являются частью проекта, будут отображаться как значки "призрак"
- Выберите нужный файл и выберите "Включить в проект" из контекстного меню
Ответ 2
Я нашел " Показать отсутствующие файлы" Расширение Visual Studio. Он отобразит список отсутствующих файлов в окне "Список ошибок" после сборки.
Ответ 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.
- Запустите проверку; для примера 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 показывает все файлы.