ich bastel mir gerade eine umfangreiche Projektvorlage und habe ein kleines Problem mit den SolutionFolders. Wenn man in VS eine leere Projektmappe anlegt, kann man diese ja mit "logischen Ordnern" strukturieren. Mit "logisch" meine ich, das sie nicht physikalisch auf der Festplatte als Ordner angelegt werden.
Nun versuche ich dasselbe mit einer Projektvorlage. Dafür gibt es einen Abschnitt "SolutionFolder"
Dummerweise werden aber hier die Ordner "1. UI", "2. Application" etc. auch als physikalischer Ordner mit angelegt. Das wäre zwar ertragbar, aber doch nicht gewünscht, von meiner Seite her.
Hat hier jemand Ideen, wie man das vermeiden kann? Die MSDN ist nach wie vor grottig, da steht ja nur drin "Mit dem SolutionFolder können Sie einen SolutionFolder einfügen".
Ich habe schon in den <TemplateData> den Eintrag <CreateNewFolder>false</CreateNewFolder> versucht, und auch alle "CreateNewfolder" in den Unterprojekten auf False gesetzt, nur hatte dies rein gar keine Wirkung. Die Projekte sehen absolut identisch aus.
Google war mir auch keine Hilfe, so dass ich hoffe, das sich hier jemand findet.
Microsoft ist mir ja ein Rätsel. Da ermöglichen die es, in VS Projektmappenordner anzulegen, die nur Virtuell sind. Dann ermöglichen sie es, dies auch in den Templates zu tun, aber legen die dort IMMER physikalisch an, anstatt hier einfach genau so zu arbeiten oder wenigstens ein "IsVirtual=True" mit einzubauen. Immer dasselbe. Kaum sieht man mal etwas interessantes, muss man feststellen das es mal wieder nur halbherzig implementiert ist. Dafür könnte ich MS echt in den Hintern treten......
Genug aufgeregt, ich hätte hier eine Lösung anzubieten.
Das Template kann quasi unverändert bleiben, und das eigentliche Anlegen geschieht nun per Code im Wizard. Die SolutionFolders sind danach dann nur Virtuell, wie beabsichtigt] (müsst Ihr selbst nach C# konvertieren, wir arbeiten leider mit VB)
1) Die ProjectCollection wird im Template verschoben. Sie wandert jetzt exakt wie sie ist, in die WizardData.
Private dte As EnvDTE._DTE Private _runKind As WizardRunKind Private _replacementsDictionary As Dictionary(Of String, String)
Public Sub RunStarted(automationObject As Object, replacementsDictionary As System.Collections.Generic.Dictionary(Of String, String), runKind As Microsoft.VisualStudio.TemplateWizard.WizardRunKind, customParams() As Object) Implements Microsoft.VisualStudio.TemplateWizard.IWizard.RunStarted dte = DirectCast(automationObject, EnvDTE.DTE) _runKind = runKind _replacementsDictionary = replacementsDictionary
Dim sPath = CStr(customParams(0)) sPath = sPath.Substring(0, sPath.LastIndexOf("\") + 1) _replacementsDictionary.Add("$templatepath$", sPath) End Sub
3) Wirklich erstellt werden die SolutionFolders und die Unterprojekte nun in RunFinished:
Public Sub RunFinished() Implements Microsoft.VisualStudio.TemplateWizard.IWizard.RunFinished If _runKind = WizardRunKind.AsMultiProject Then Dim sol = DirectCast(dte.Solution, Solution2) AddFolders(sol, _replacementsDictionary("$wizarddata$")) End If End Sub
Private Sub AddFolders(solution As Solution2, xmlstring As String)
For Each template In element.Descendants(XName.Get("ProjectTemplateLink", ns)) Dim templatePath = template.Value Dim projectName As String
xAtt = template.Attribute(XName.Get("ProjectName")) If Not xAtt Is Nothing Then projectName = xAtt.Value.Replace("$shortname$", _shortName)
Dim destinationPath = _replacementsDictionary("$destinationdirectory$") & "\" & projectName Directory.CreateDirectory(destinationPath)
Dim SF As SolutionFolder SF = CType(currentFolder.Object, SolutionFolder) SF.AddFromTemplate(_replacementsDictionary("$templatepath$") & templatePath, destinationPath, projectName)
End If Next End If Next End Sub
Im Prinzip müsst Ihr nur Euren Wizard erweitern und sonst kann die ProjectCollection halt exakt wie sie ist, etwas verschoben werden. Dies halte ich für eine recht angenehme Lösung. Der Quellcode funktioniert, könnte vielleicht etwas eleganter sein, aber nach 6 Stunden Suche mag ich langsam nicht mehr.
Viel Spass damit Jens
Hm...Nichtmal CK unterstützt wohl VB, wenn ich mir die Farbgebung mal anschaue :)
+1 Gut zu wissen und danke für's Teilen, auch wenn ich es aktuell grad nicht brauche. Was die Farbgebung angeht: das liegt vermutlich nicht an VB, sondern dürfte ein allgemeiner Bug in CK sein. Er kommt bei "\" durcheinander und erkennt das Schließen des Strings nicht. Ein "\\" hilft leider nicht, kurioserweise kann man mit "\\\" dann aber einen doppelten Backslash wieder korrekt darstellen. Ein ähnliches Problem gibt es mit [i], das im Code als \[i] geschrieben werden muss, damit es korrekt dargestellt wird. Lästig, weil man dadurch nicht einfach C&P nutzen kann.
+1 Trifft sich, dass das Thema gerade jetzt auftaucht, da ich in für die nahe Zukunft geplant hatte mir für meine Projekte auch mal ein Template zu machen. Diese virtuellen Ordner kommen mir da gerade Recht.
Was die Farbgebung angeht: das liegt vermutlich nicht an VB, sondern dürfte ein allgemeiner Bug in CK sein. Er kommt bei "\" durcheinander und erkennt das Schließen des Strings nicht. Ein "\\" hilft leider nicht, kurioserweise kann man mit "\\\" dann aber einen doppelten Backslash wieder korrekt darstellen.
Ein ähnliches Problem gibt es mit [i], das im Code als \[i] geschrieben werden muss, damit es korrekt dargestellt wird. Lästig, weil man dadurch nicht einfach C&P nutzen kann.