Frage

Ich habe einen Zweig von C # -Code aus der Quellcodeverwaltung ausgecheckt. Es enthält vielleicht 50 Projekte in verschiedenen Ordnern. Es gibt keine vorhandene SLN-Datei gefunden werden.

Ich wollte eine leere Lösung zu schaffen, bestehende Lösungen hinzuzufügen. Die Benutzeroberfläche läßt mich nur zu einer Zeit, dies ein Projekt tun.

Gibt es etwas, was ich vermisst habe? Ich möchte eine Liste von * CSPROJ Dateien angeben und irgendwie mit einer SLN-Datei kommen, die alle Projekte enthält.

War es hilfreich?

Lösung

Hier ist ein Powershell-Version von Bertrandsche Skript, das neben der Lösungsdatei eine Src und Testverzeichnis annimmt.

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()

Andere Tipps

Eine Powershell-Implementierung, die das Skript Verzeichnis für CSPROJ Dateien rekursiv durchsucht und fügt sie zu einem (generiert) 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()

Eine C # -Implementierung, die eine ausführbare Datei erzeugt, das eine Lösung in wird es ausgeführt, die alle einzigartig * CSPROJ Dateien aus dem Verzeichnis und das Unter erstellt.

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);
    }
  }
}

Es gibt Erweiterung für VS zur Verfügung, die fähig ist, alle Projekte in ausgewähltem Verzeichnis hinzugefügt (und mehr):

http: // www.cyotek.com/blog/visual-studio-extension-for-adding-multiple-projects-to-a-solution

Möglicherweise können Sie ein kleines Powershell-Skript oder .NET-Anwendung schreiben, die alle XML CSPROJ Projekte analysiert und extrahiert die Details (ProjectGuid etc.) dann in die SLN-Datei hinzufügt. Es wäre schneller und weniger riskant, sie alle von Hand zu haben, aber eine interessante Herausforderung dennoch.

Hinweis: Dies ist nur für Visual Studio 2010

hier ist eine coole fügen Sie in für Visual Studio 2010, dass Sie eine Powershell-Konsole in VS gibt Ihnen mit dem IDE lassen interagieren. Unter vielen anderen Dingen können Sie die integrierte VS Erweiterbarkeit tun mit, wie durch @Avram erwähnt, wäre es ziemlich einfach sein, Dateien oder Projekte zu einer Lösung hinzuzufügen.

Verwenden Sie Visual Studio-Erweiterung " bestehende Projekte ". Es arbeitet mit Visual Studio 2012, 2013, 2015, 2017.

, um die Erweiterung zu verwenden, öffnen Sie das Extras Menü und wählen Sie Projekte hinzufügen .

Wenn Sie die SLN-Datei mit Notepad öffnen können Sie das Format der Datei sehen, die leicht zu verstehen, aber für weitere Informationen einen Blick @ nehmen Hack des Projekts und Lösungsdateien die Struktur der Lösung .understanding Dateien können Sie eine Anwendung schreiben, die alle Projektdateien öffnen und schreibt die Anwendungsnamen, Adresse und GUID in die SLN-Datei.

natürlich denke ich, wenn es nur, wenn Sie es manuell besser

Jede Antwort scheint die Verzeichnisstruktur zu glätten (alle Projekte werden zu der Lösung Wurzel, ohne die Ordnerhierarchie zu respektieren). So codierte ich meine eigene Konsole-Anwendung, die die Lösung erzeugt und verwendet Lösung Ordner gruppiert.

Überprüfen Sie das Projekt aus in GitHub

Verwendung

  SolutionGenerator.exe --folder C:\git\SomeSolutionRoot --output MySolutionFile.sln

Abhängig von Visual Studio-Version.
Aber der Name dieses Prozesses ist „Automatisierung und Erweiterbarkeit für Visual Studio“
http://msdn.microsoft.com/en-us/library/t51cz75w. aspx

Check this out: http://nprove.codeplex.com/

Es ist ein kostenloses Add-für VS2010, der tut das und mehr  wenn die Projekte im Rahmen der tfs sind

Aufbauend auf Bertrandsche Antwort auf https://stackoverflow.com/a/16069782/492 - eine Konsole app machen aus diesem und im Stammordner ausführen, auf dem Sie die VS 2015-Lösung angezeigt werden soll. Es funktioniert für C # und VB (hey! Nett sein).

Sie überschreibt alles vorhandene, aber Sie Quellcodeverwaltung, nicht wahr?

Überprüfen Sie eine kürzlich verwendete SLN-Datei, was die ersten paar writer.WriteLine() Kopfzeilen tatsächlich von der Zeit sein sollte, um zu sehen, das Sie lesen.

Sie sich keine Sorgen über den Projekttyp GUID Ptoject("0") -. Visual Studio wird das funktionieren und schreiben Sie es in, wenn Sie die SLN-Datei speichern

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));
        }
    }
}

Wenn Sie die Option ‚Alle Dateien anzeigen‘ im Solution Explorer können Sie als sehen Sie alle Dateien und folers und markieren Sie diese und klicken Sie rechts, um sie hinzuzufügen ‚in Project Sie‘ verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top