طريقة سهلة لإضافة متعددة .csproj الموجودة إلى محلول Visual Studio؟

StackOverflow https://stackoverflow.com/questions/1891035

سؤال

لقد راجعت فرع من كود C # من التحكم المصدر. أنه يحتوي على 50 مشروعا في مجلدات مختلفة. لا يوجد ملف .sln موجود يمكن العثور عليه.

كنت تعتزم إنشاء حل فارغ لإضافة الحلول الموجودة. يتيح لي UI فقط أن أفعل هذا المشروع واحد في وقت واحد.

هل هناك شيء أفتقده؟ أود تحديد قائمة من ملفات .csproj وتوصل بطريقة أو بأخرى إلى ملف .sln يحتوي على جميع المشاريع.

هل كانت مفيدة؟

المحلول

فيما يلي إصدار PowerShell من برنامج Bertrand's Script الذي يفترض 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 ويضيفها إلى (تم إنشاؤه) 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()

تطبيق AC # الذي ينتج قابل للتنفيذ، مما يخلق حلا يحتوي على جميع ملفات * .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.

قد تكون قادرا على كتابة تطبيق Script أو .NET Little PowerShell أو التطبيق الذي يقوم بتوزيع جميع المشاريع ".csproj XML واستخراج تفاصيلهم (ProjectGuid وما إلى ذلك) ثم يضيفها إلى ملف .sln. سيكون أسرع وأقل محفوفة بالمخاطر لإضافتهم جميعا باليد، ولكن هناك تحد مثير للاهتمام.

ملحوظة: هذا هو فقط في Visual Studio 2010

وجدت هنا هي إضافة رائعة في Visual Studio 2010 التي تمنحك وحدة تحكم PowerShell في مقابل السماح لك بالتفاعل مع IDE. من بين العديد من الأشياء الأخرى التي يمكنك القيام بها باستخدام إمداد القابلية المدمج في VS كما هو مذكور في Avram، سيكون من السهل جدا إضافة الملفات أو المشاريع إلى حل.

استخدام ملحق مرئي استوديو "أضف المشروعات الموجودة". إنه يعمل مع Visual Studio 2012، 2013، 2015، 2017.

enter image description here

لاستخدام التمديد، افتح أدوات القائمة واختيار إضافة مشاريع.

إذا قمت بفتح ملف SLN مع المفكرة، فيمكنك رؤية تنسيق الملف الذي يسهل فهمه ولكن لمزيد من المعلومات إلقاء نظرة على @ اختراق ملفات المشروع والحل التحقق من بنية ملفات الحلول التي يمكنك كتابة تطبيق سيفتح جميع ملفات المشروع واكتب اسم التطبيق وعنوانه و GUID إلى ملف SLN.

بالطبع أعتقد أنه إذا كان بمجرد أن تفعل ذلك بشكل أفضل يدويا

يبدو أن كل إجابة تتسطح بنية الدليل (يتم إضافة جميع المشاريع إلى جذر الحل، دون احترام التسلسل الهرمي للمجلد). لذلك، قمت بترميز تطبيق My Console الخاص بي الذي يولد الحل ويستخدم مجلدات الحلول لتجميعها.

تحقق من المشروع في جيثب

الاستعمال

  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/

إنه Addin مجاني ل 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));
        }
    }
}

إذا قمت بتحديد "إظهار جميع الملفات" في مستكشف الحلول، فيمكنك عرض جميع الملفات والأوراق النقطية وحددها والنقر بزر الماوس الأيمن لإضافتها باستخدام "تضمينها في المشروع".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top