Легкий способ добавить несколько существующих .csproj в решение Visual Studio?
Я проверил ветку кода С# из исходного элемента управления. Он содержит, возможно, 50 проектов в разных папках. Там не существует существующего .sln файла.
Я намеревался создать пустое решение для добавления существующих решений. Пользовательский интерфейс позволяет мне делать только один проект за раз.
Есть ли что-то, что мне не хватает? Я хотел бы указать список файлов *.csproj и каким-то образом создать файл .sln, содержащий все проекты.
Ответы
Ответ 1
Вот версия Bertrand script для PowerShell, которая предполагает наличие файла Src и Test рядом с файлом решения.
function GetGuidFromProject([string]$fileName) {
$content = Get-Content $fileName
$xml = [xml]$content
$obj = $xml.Project.PropertyGroup.ProjectGuid
return [Guid]$obj[0]
}
$slnPath = "C:\Project\Foo.sln"
$solutionDirectory = [System.IO.Path]::GetDirectoryName($slnPath)
$srcPath = [System.IO.Path]::GetDirectoryName($slnPath)
$writer = new-object System.IO.StreamWriter ($slnPath, $false, [System.Text.Encoding]::UTF8)
$writer.WriteLine("Microsoft Visual Studio Solution File, Format Version 12.00")
$writer.WriteLine("# Visual Studio 2013")
$projects = gci $srcPath -Filter *.csproj -Recurse
foreach ($project in $projects) {
$fileName = [System.IO.Path]::GetFileNameWithoutExtension($project)
$guid = GetGuidFromProject $project.FullName
$slnRelativePath = $project.FullName.Replace($solutionDirectory, "").TrimStart("\")
# Assume the project is a C# project {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
$writer.WriteLine("Project(""{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"") = ""$fileName"", ""$slnRelativePath"",""{$($guid.ToString().ToUpper())}""")
$writer.WriteLine("EndProject")
}
$writer.Flush()
$writer.Close()
$writer.Dispose()
Ответ 2
Реализация PowerShell, которая рекурсивно сканирует каталог script для файлов .csproj и добавляет их в (сгенерированный) All.sln:
$scriptDirectory = (Get-Item $MyInvocation.MyCommand.Path).Directory.FullName
$dteObj = [System.Activator]::CreateInstance([System.Type]::GetTypeFromProgId("VisualStudio.DTE.12.0"))
$slnDir = ".\"
$slnName = "All"
$dteObj.Solution.Create($scriptDirectory, $slnName)
(ls . -Recurse *.csproj) | % { $dteObj.Solution.AddFromFile($_.FullName, $false) }
$dteObj.Solution.SaveAs( (Join-Path $scriptDirectory 'All.sln') )
$dteObj.Quit()
Ответ 3
Реализация С#, которая создает исполняемый файл, который создает решение, содержащее все уникальные *.csproj файлы из каталога и подкаталогов, в которых он выполняется.
class Program
{
static void Main(string[] args)
{
using (var writer = new StreamWriter("All.sln", false, Encoding.UTF8))
{
writer.WriteLine("Microsoft Visual Studio Solution File, Format Version 11.00");
writer.WriteLine("# Visual Studio 2010");
var seenElements = new HashSet<string>();
foreach (var file in (new DirectoryInfo(System.IO.Directory.GetCurrentDirectory())).GetFiles("*.csproj", SearchOption.AllDirectories))
{
string fileName = Path.GetFileNameWithoutExtension(file.Name);
if (seenElements.Add(fileName))
{
var guid = ReadGuid(file.FullName);
writer.WriteLine(string.Format(@"Project(""0"") = ""{0}"", ""{1}"",""{2}""", fileName, file.FullName, guid));
writer.WriteLine("EndProject");
}
}
}
}
static Guid ReadGuid(string fileName)
{
using (var file = File.OpenRead(fileName))
{
var elements = XElement.Load(XmlReader.Create(file));
return Guid.Parse(elements.Descendants().First(element => element.Name.LocalName == "ProjectGuid").Value);
}
}
}
Ответ 4
Существует расширение для VS, которое может добавлять все проекты в выбранный каталог (и более):
http://www.cyotek.com/blog/visual-studio-extension-for-adding-multiple-projects-to-a-solution
Ответ 5
Возможно, вы сможете написать небольшое приложение PowerShell script или .NET, которое анализирует все проекты .csproj XML и извлекает их детали (ProjectGuid и т.д.), а затем добавляет их в файл .sln. Было бы быстрее и менее рискованно добавлять их все вручную, но тем не менее интересной задачей.
Ответ 6
Примечание: Это только для Visual Studio 2010
Найдено здесь - это классное дополнение для Visual Studio 2010, которое дает вам консоль PowerShell в VS, чтобы вы могли взаимодействовать с IDE. Среди многих других вещей, которые вы можете использовать, используя встроенную расширяемость VS, как упоминалось в @Avram, было бы довольно легко добавить файлы или проекты в решение.
Ответ 7
если вы открываете файл sln с помощью блокнота, вы можете видеть формат файла, который легко понять, но для получения дополнительной информации смотрите @Взломайте Файлы проекта и решения. Понимая структуру файлов решений, вы можете написать приложение, которое откроет все файлы проекта и напишет имя приложения, адрес и GUID в файл sln.
конечно, я думаю, если это только раз вам лучше сделать это вручную
Ответ 8
Каждый ответ, похоже, сглаживает структуру каталогов (все проекты добавляются в корень решения без уважения к иерархии папок). Итак, я закодировал собственное консольное приложение, которое генерирует решение и использует папки решений для их группировки.
Проверьте проект в GitHub
Использование
SolutionGenerator.exe --folder C:\git\SomeSolutionRoot --output MySolutionFile.sln
Ответ 9
Зависит от версии визуальной студии.
Но название этого процесса - "Автоматизация и расширяемость для Visual Studio"
http://msdn.microsoft.com/en-us/library/t51cz75w.aspx
Ответ 10
Проверьте это:
http://nprove.codeplex.com/
Это бесплатный addin для vs2010, который делает это и многое другое
если проекты находятся под tfs
Ответ 11
Основываясь на ответе Бертрана на fooobar.com/questions/172495/... - сделайте консольное приложение из этого и запустите его в корневой папке, где вы хотите, чтобы VS 2015 Solution появилось. Он работает для С# и VB (эй, будь красивым).
Он перезаписывает все существующее, но вы контролируете исходный код, правильно?
Проверьте недавно использованный .SLN файл, чтобы увидеть, что первые несколько строк заголовка writer.WriteLine()
должны быть на самом деле на момент его чтения.
Не беспокойтесь о GUID проекта Ptoject("0")
- Visual Studio будет работать и записывать его при сохранении .sln файла.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace AddAllProjectsToNewSolution
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("starting");
using (var writer = new StreamWriter("AllProjects.sln", false, Encoding.UTF8))
{
writer.WriteLine("Microsoft Visual Studio Solution File, Format Version 14.00");
writer.WriteLine("# Visual Studio 14");
writer.WriteLine("VisualStudioVersion = 14.0.25420.1");
var seenElements = new HashSet<string>();
foreach (var file in (new DirectoryInfo(Directory.GetCurrentDirectory())).GetFiles("*.*proj", SearchOption.AllDirectories))
{
string extension = file.Extension;
if (extension != ".csproj" && extension != ".vbproj")
{
Console.WriteLine($"ignored {file.Name}");
continue;
}
Console.WriteLine($"adding {file.Name}");
string fileName = Path.GetFileNameWithoutExtension(file.Name);
if (seenElements.Add(fileName))
{
var guid = ReadGuid(file.FullName);
writer.WriteLine($"Project(\"0\") = \"{fileName}\", \"{GetRelativePath(file.FullName)} \", \"{{{guid}}}\"" );
writer.WriteLine("EndProject");
}
}
}
Console.WriteLine("Created AllProjects.sln. Any key to close");
Console.ReadLine();
}
static Guid ReadGuid(string fileName)
{
using (var file = File.OpenRead(fileName))
{
var elements = XElement.Load(XmlReader.Create(file));
return Guid.Parse(elements.Descendants().First(element => element.Name.LocalName == "ProjectGuid").Value);
}
}
// https://stackoverflow.com/a/703292/492
static string GetRelativePath(string filespec, string folder = null)
{
if (folder == null)
folder = Environment.CurrentDirectory;
Uri pathUri = new Uri(filespec);
// Folders must end in a slash
if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString()))
folder += Path.DirectorySeparatorChar;
Uri folderUri = new Uri(folder);
return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString().Replace('/', Path.DirectorySeparatorChar));
}
}
}
Ответ 12
Используйте расширение Visual Studio " Добавить существующие проекты ". Он работает с Visual Studio 2012, 2013, 2015, 2017.
![enter image description here]()
Чтобы использовать расширение, откройте меню " Инструменты" и выберите " Добавить проекты".
Ответ 13
Если вы выберите "Показать все файлы" в обозревателе решений, вы можете просмотреть все файлы и файлы и выбрать их и щелкнуть правой кнопкой мыши, чтобы добавить их, используя "Включить в проект".