我从源代码管理中检查了一个C#代码分支。它包含各种文件夹中的50个项目。没有找到现有的.sln文件。
我打算创建一个空白解决方案来添加现有解决方案。用户界面只允许我一次完成这个项目。
有什么我想念的吗?我想指定一个* .csproj文件列表,并以某种方式提出一个包含所有项目的.sln文件。
答案 0 :(得分:22)
PowerShell实现,以递归方式扫描脚本目录中的.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()
答案 1 :(得分:15)
生成可执行文件的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);
}
}
}
答案 2 :(得分:8)
VS的扩展可用,能够添加所选目录中的所有项目(以及更多):
http://www.cyotek.com/blog/visual-studio-extension-for-adding-multiple-projects-to-a-solution
答案 3 :(得分:4)
您可以编写一个小的PowerShell脚本或.NET应用程序来解析所有项目的.csproj XML并提取它们的详细信息(ProjectGuid等),然后将它们添加到.sln文件中。手动添加它们会更快,风险更小,但仍然是一个有趣的挑战。
答案 4 :(得分:3)
注意:这仅适用于Visual Studio 2010
发现here是Visual Studio 2010的一个很酷的补充,它为您提供VS中的PowerShell控制台,让您与IDE进行交互。使用@Avram提到的内置VS可扩展性可以做很多其他事情,将文件或项目添加到解决方案中会非常容易。
答案 5 :(得分:3)
以下是Bertrand脚本的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()
答案 6 :(得分:1)
如果用记事本打开sln文件,你可以看到文件的格式,这很容易理解但是有关更多信息,请查看@ Hack the Project and Solution Files。了解解决方案文件的结构,你可以编写一个应用程序这将打开所有项目文件,并将应用程序名称,地址和GUID写入sln文件。
当然,我认为如果只是一次你最好手动完成
答案 7 :(得分:1)
每个答案似乎都会使目录结构变平(所有项目都会添加到解决方案根目录中,而不考虑文件夹层次结构)。因此,我编写了自己的控制台应用程序来生成解决方案,并使用解决方案文件夹对它们进行分组。
中查看项目用法
SolutionGenerator.exe --folder C:\git\SomeSolutionRoot --output MySolutionFile.sln
答案 8 :(得分:0)
取决于视觉工作室版本。
但是这个过程的名称是“Visual Studio的自动化和可扩展性”
http://msdn.microsoft.com/en-us/library/t51cz75w.aspx
答案 9 :(得分:0)
检查一下: http://nprove.codeplex.com/
它是vs2010的免费插件,可以做到这一点以及更多 如果项目属于tfs
答案 10 :(得分:0)
以Bertrand在https://stackoverflow.com/a/16069782/492的回答为基础 - 制作一个控制台应用程序并在你希望VS 2015解决方案出现的根文件夹中运行它。它适用于C#&amp; VB(嘿!很好)。
它会覆盖现有的任何东西,但是你来源控件,对吗?
检查最近使用的.SLN文件,以便在阅读本文时查看前几个writer.WriteLine()
标题行应该是什么。
不要担心项目类型GUID Ptoject("0")
- 当您保存.sln文件时,Visual Studio会将其解决并写入。
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));
}
}
}
答案 11 :(得分:0)
使用Visual Studio扩展“ Add Existing Projects”。它可以与Visual Studio 2012、2013、2015、2017一起使用。
要使用扩展程序,请打开工具菜单,然后选择添加项目。
答案 12 :(得分:0)
当你安装了 dotnet 核心后,你可以从 git bash 执行这个:
donet new sln; find . -name "*.csproj" -exec dotnet sln add {} \;
生成的解决方案适用于为旧的 .NET Framework 创建的 csproj。
答案 13 :(得分:-2)
如果在解决方案资源管理器中选择“显示所有文件”,则可以查看所有文件和文件夹并选择它们,然后右键单击以使用“包括在项目中”添加它们。