Soru Visual Studio Çözümüne birden çok varolan .csproj eklemenin kolay yolu?


Kaynak kontrolünden C # kodunun bir şubesini kontrol ettim. Çeşitli klasörlerde belki 50 proje içeriyor. Bulunacak mevcut .sln dosyası yok.

Mevcut çözümleri eklemek için boş bir çözüm oluşturmayı planladım. UI sadece bir projeyi aynı anda yapmamı sağlıyor.

Kaybettiğim bir şey mi var? * .Csproj dosyalarının bir listesini belirtmek istiyorum ve bir şekilde tüm projeleri içeren bir .sln dosyasını bulmak istiyorum.


32
2017-12-11 21:39


Menşei


Her seferinde bir tane olsa bile, şimdiye kadar 50 tane ekleyebilirdiniz. - Ed S.
Ed ile aynı fikirdeyim. Şimdiye kadar yapılmış olabilir. - IEnumerator
Onları el ile ekleyerek eğlencelidir - Visual Studio ile uğraşmak, basit bir şey yapmak için uğraşmaya çalışmak, şimdi eğlencelidir. - Andy White
Tabii, elbette şu ana kadar yapılmış olabilir. Sorunun amacı gelecekteki hayal kırıklığından kaçınmaktı. Ve göze çarpan bir şeyi kaçırıp kaçırmadığımı görmek için iki kez kontrol et. Herkesin soruya verdiği önem için teşekkürler. - Michael J Swart
Bunu daha az sayıda proje için biraz daha kolay hale getirmek için bir çözüm, File.AddExistingProject öğesini sol elinizle kullanabileceğiniz bir kısayol anahtarına eşlemektir, ardından tarayıcıyı bununla birlikte açabilir ve fare elinizle seçip ekleyebilirsiniz. - Whelkaholism


Cevaplar:


İşte çözüm dosyasının yanında bir Src ve Test dizini varsayan Bertrand'ın betiğinin bir PowerShell sürümüdür.

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

2
2017-10-07 02:05





Yinelenen .csproj dosyaları için komut dizini tarar ve bunları (oluşturulan) All.sln için ekler bir PowerShell uygulaması:

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

21
2018-05-17 13:00



Bu harika! Teşekkürler. - Michael J Swart
Benim için çalışma değil = ((Join-Path: 'Path' parametresine argüman bağlanılamıyor çünkü null. Line: 1 char: 36 + $ dteObj.Solution.SaveAs ((Join-Path <<<< $ scriptDirectory ' All.sln ')) + CategoryInfo: InvalidData: (:) [Birleştirme Yolu], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationErrorNullNotAllowed, Microsoft.PowerShell.Commands.JoinPathCom mand) - J. Lennon
Ben $ dteObj.Solution null olduğunu almaya devam ediyorum. Bunu nasıl aştın? - Denis
Yeni Nesne kullanmak için DTE nesnesinin yapısını değiştirmek için cevabı güncelledim. Şu anda hakemli olarak inceleniyor, ancak komut dosyasını el ile değiştirmek isterseniz, 2. satırı şu şekilde değiştirin: $ dteObj = Yeni Nesne -ComObject "VisualStudio.DTE.10.0" (sürüm numarasını Studio'yu her hangi bir sürümüne değiştirin) kullanıyorsun. - Joe The Coder


Yürütülen dizin ve alt dizinlerden tüm benzersiz * .csproj dosyalarını içeren bir çözüm oluşturan bir yürütülebilir dosya üreten bir C # uygulaması.

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

15
2018-04-17 20:34



(En sevdiğim yeni komut dosyası aracı) komut dosyalarını kullanmak isterseniz, işlevleri sınıfın dışına taşıyabilir, yukarıdaki ReadGuid öğesinin üstüne ve işlev kapsamının dışındaki ana içeriğe taşıyabilir ve .csx olarak kaydedebilirsiniz. - James White
IMHO bu kabul edilen cevap olmalı. İlk seçenekten daha hızlı. - Ignacio Soler Garcia


VS için tüm projeyi seçili dizine (ve daha fazlasına) ekleyebilecek uzantı var:

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


8
2018-02-01 21:24



Güzel. VS2015'te iyi çalışıyor. :) - user2173353
VS2012'de çalışmıyor ama ...github.com/cyotek/Cyotek.AddProjects/issues/4 - prom85
VS2017'de de çalışmıyor. :( - JDługosz
Thats üzgün :( bir geçici çözüm olarak sadece bunun için 2015 kullanabilirsiniz, ancak daha iyi bir çözüm olması harika olurdu. - kwesolowski


Tüm projelerin .csproj XML'ini ayrıştıran ve kendi detaylarını (ProjectGuid vb.) Ayıklayan küçük bir PowerShell komut dosyası veya .NET uygulaması yazabilirsiniz. Daha sonra bunları .sln dosyasına eklersiniz. Her şeyi el ile eklemek daha hızlı ve daha az riskli olurdu, ancak yine de ilginç bir meydan okuma.


4
2017-12-11 21:54





Not: Bu sadece Visual Studio 2010 içindir

Bulunan İşte Visual Studio 2010'da, IDE ile etkileşimde bulunmanıza izin vermek için VS'de bir PowerShell konsolu sağlayan harika bir eklentidir. @Avram tarafından belirtildiği gibi yerleşik VS uzayabilirliğini kullanarak yapabileceğiniz pek çok şey arasında, bir dosyaya dosya veya proje eklemek oldukça kolay olurdu.


3
2018-04-24 17:10





Eğer sln dosyasını notepad ile açarsanız, anlaşılması kolay dosyanın formatını görebilirsiniz ancak daha fazla bilgi için bir göz atınız. Proje ve Çözüm Dosyalarını Hack Etme .Program dosyalarının yapısını anlatarak, tüm proje dosyalarını açacak ve sln dosyasına uygulama adı, adres ve GUID yazacak bir uygulama yazabilirsiniz.

Tabii ki, eğer sadece bir kez daha iyi yaparsanız


1
2017-12-11 22:16





Her cevap dizin yapısını düzleştiriyor gibi görünüyor (tüm projeler klasör hiyerarşisine saygı duymadan çözüm köküne eklenir). Bu yüzden, çözümü üreten ve bunları gruplandırmak için çözüm klasörleri kullanan kendi konsol uygulamamı kodladım.

Projeye göz atın GitHub

kullanım

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

1
2017-09-24 18:23





Görsel stüdyo versiyonuna bağlı.
Ancak bu sürecin adı "Visual Studio için Otomasyon ve Genişletilebilirlik" dir.
http://msdn.microsoft.com/en-us/library/t51cz75w.aspx


0
2017-12-11 22:06





Şuna bak: http://nprove.codeplex.com/

Bu ve daha fazlasını yapan vs2010 için ücretsiz bir eklenti  Projeler tfs altında ise


0
2017-12-12 07:57