Façon facile d'ajouter plusieurs existants.csproj à une Solution de studio visuel?
j'ai vérifié une branche du code C du contrôle source. Il contient peut-être 50 projets dans différents dossiers. Il n'y a pas d'existant .la sln fichier se trouve.
j'avais l'intention de créer une solution vierge pour ajouter des solutions existantes. L'iu ne me permet de faire ce projet qu'une seule fois.
<!-- Y a-t-il quelque chose que je manque? J'aimerais préciser une liste de *.csproj fichiers et en quelque sorte venir avec un .fichier sln qui contient tous les projets.13 réponses
Voici une version PowerShell du script de Bertrand qui suppose un répertoire Src et Test à côté du fichier solution.
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()
une implémentation PowerShell qui scanne récursivement le répertoire de script.csproj fichiers et les ajoute à un (généré).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()
une implémentation C# qui produit un exécutable, qui crée une solution contenant tous les *uniques.les fichiers csproj du répertoire et des sous-répertoires dans lesquels il est exécuté.
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);
}
}
}
Il y a une extension pour VS disponible, capable d'additionner tous les projets dans le répertoire sélectionné (et plus):
http://www.cyotek.com/blog/visual-studio-extension-for-adding-multiple-projects-to-a-solution
vous pourriez être en mesure d'écrire un petit script PowerShell ou une application .Net qui analyse tous les projets.csproj XML et extrait leurs détails (Guide de projet, etc.) puis de les ajouter dans le .la sln fichier. Il serait plus rapide et moins risqué de les ajouter tous à la main, mais un défi intéressant néanmoins.
Remarque: Ce n'est que pour Visual Studio 2010
ici est cool add in pour Visual Studio 2010 qui vous donne une console PowerShell en VS pour vous permettre d'interagir avec l'IDE. Parmi beaucoup d'autres choses que vous pouvez faire en utilisant L'extensibilité VS intégrée comme mentionné par @Avram, il serait assez facile d'ajouter des fichiers ou des projets à une solution.
si vous ouvrez le fichier sln avec notepad vous pouvez voir le format du fichier qui est facile à comprendre mais pour plus d'info jetez un oeil @ Pirater le Projet et les Fichiers de Solution .comprendre la structure des fichiers de solution vous pouvez écrire une application qui ouvrira tous les fichiers de projet et écrira le nom de l'application ,l'adresse et le guide au fichier sln .
bien sûr, je pense que si c'est juste une fois que vous mieux de le faire manuellement
chaque réponse semble aplatir la structure du répertoire (tous les projets sont ajoutés à la solution root, sans respecter la hiérarchie du répertoire). Ainsi, j'ai codé ma propre application de console qui génère la solution et utilise des dossiers de solution pour les grouper.
découvrez le projet GitHub
Utilisation
SolutionGenerator.exe --folder C:\git\SomeSolutionRoot --output MySolutionFile.sln
dépend de la version visual studio.
Mais le nom de ce processus est "Automation et extensibilité pour Visual Studio"
http://msdn.microsoft.com/en-us/library/t51cz75w.aspx
Check this out: http://nprove.codeplex.com/
c'est un addin gratuit pour vs2010 qui fait cela et plus si les projets sont sous la tsf
en S'appuyant sur la réponse de Bertrand à https://stackoverflow.com/a/16069782/492 - Créer une application console à partir de cela et l'exécuter dans le dossier racine où vous voulez que la Solution VS 2015 apparaisse. Il fonctionne pour C# & VB (hey! être gentil).
il écrase tout ce qui existe mais vous contrôlez les sources, non?
cochez une réponse récente .La SLN fichier pour voir ce que les premiers writer.WriteLine()
lignes d'en-tête doit être en fait au moment où vous lisez ceci.
Ne vous inquiétez pas A propos du projet type GUID Ptoject("0")
- Visual Studio s'en chargera et l'écrira quand vous enregistrerez le .la sln fichier.
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));
}
}
}
Utiliser L'Extension De Visual Studio " Ajouter Des Projets Existants". Il fonctionne avec Visual Studio 2012, 2013, 2015, 2017.
pour utiliser l'extension, ouvrez le Outils menu et choisir Ajouter Des Projets.
si vous sélectionnez 'Afficher tous les fichiers' dans L'Explorateur de solutions, vous pouvez afficher tous les fichiers et les folers et les sélectionner et cliquez avec le bouton droit de la souris pour les ajouter en utilisant 'inclure dans le projet'.