Простой способ добавить несколько существующих.csproj для решения Visual Studio?
Я проверил ветвь кода C# из системы управления версиями. Он содержит около 50 проектов в различных папках. Нет никакого существования .файл sln будет найден.
Я намеревался создать пустое решение для добавления существующих решений. Пользовательский интерфейс позволяет мне делать только один проект за раз.
Я что-то упускаю? Я хотел бы указать список *.файлы csproj и как-то придумали.sln-файл, содержащий все проекты.
13 ответов
вот версия сценария Бертрана PowerShell, которая предполагает Src и тестовый каталог рядом с файлом решения.
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()
реализация PowerShell, которая рекурсивно сканирует каталог скриптов .файлы csproj и добавляет их в (сгенерированные) все.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()
реализация C#, которая создает исполняемый файл, который создает решение, содержащее все уникальные *.файлы 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);
}
}
}
доступно расширение для VS, способное добавлять все проекты в выбранный каталог (и многое другое):
http://www.cyotek.com/blog/visual-studio-extension-for-adding-multiple-projects-to-a-solution
возможно, вы сможете написать небольшой скрипт PowerShell или .NET-приложение, которое анализирует все проекты" .csproj XML и извлекает их детали (ProjectGuid и т. д.) затем добавляет их в .sln файл. Было бы быстрее и менее рискованно добавлять их все вручную, но тем не менее интересная задача.
Примечание: это только для Visual Studio 2010
нашел здесь - это классная надстройка для Visual Studio 2010, которая дает вам консоль PowerShell в VS, чтобы вы могли взаимодействовать с IDE. Среди многих других вещей, которые вы можете сделать, используя встроенную расширяемость VS, как упоминалось @Avram, было бы довольно легко добавить файлы или проекты в решение.
Если вы открываете файл sln с помощью блокнота, вы можете увидеть формат файла, который легко понять, но для получения дополнительной информации посмотрите @ взломать файлы проекта и решения .понимая структуру файлов решения, вы можете написать приложение ,которое откроет все файлы проекта и запишет имя приложения, адрес и идентификатор GUID в файл sln .
конечно, я думаю, если это только один раз, вам лучше сделать это вручную
каждый ответ, кажется, сглаживает структуру каталогов (все проекты добавляются в корень решения, не соблюдая иерархию папок). Итак, я закодировал свое консольное приложение, которое генерирует решение и использует папки решений для их группировки.
проверить проект в GitHub
использование
SolutionGenerator.exe --folder C:\git\SomeSolutionRoot --output MySolutionFile.sln
зависит от версии visual studio.
Но имя этого процесса - "автоматизация и расширяемость для Visual Studio"
http://msdn.microsoft.com/en-us/library/t51cz75w.aspx
зацени: http://nprove.codeplex.com/
Это бесплатное дополнение для vs2010, которое делает это и многое другое если проекты находятся под tfs
основываясь на ответе Бертрана в https://stackoverflow.com/a/16069782/492 - Сделайте консольное приложение из этого и запустите его в корневой папке, где вы хотите, чтобы появилось решение VS 2015. Он работает для C# и 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));
}
}
}
Использовать Расширение Visual Studio"Добавить Существующие Проекты". Он работает с Visual Studio 2012, с 2013, 2015 2017,.
чтобы использовать расширение, откройте инструменты меню и выберите Добавить Проекты.
Если вы выберете "показать все файлы" в обозревателе решений, вы можете просмотреть все файлы и папки и выбрать их и щелкните правой кнопкой мыши, чтобы добавить их с помощью "включить в проект".