Mulitargeting C # -Projektdateien mit Mono und MonoDevelop

8

Ich habe eine Sammlung von csproj-Dateien, die alle auf den gleichen Satz von Quelldateien verweisen, aber leicht unterschiedliche Zieldaten haben, so dass ich die Projektdateien getrennt aufbewahren muss. Z.B. Es gibt WinPhone, XBox, Desktop, MonoTouch-Varianten des gleichen Projekts.

Für Dinge, die wirklich dupliziert werden, wie die Liste der .cs-Dateien, die kompiliert werden sollen, möchte ich die Liste in einer einzigen Datei konsolidieren, damit ich nicht immer sicherstellen muss, dass alle Varianten synchron sind. Ich habe das ursprünglich versucht, indem ich die Quellen aus den .csprojs entfernte und sie in eine .targets-Datei steckte, die von allen csprojs importiert wurde, aber dadurch verschwanden die Quelldateien sowohl von VS als auch von MonoDevelop.

Mein zweiter Versuch bestand darin, die Desktop-csproj-Datei zur primären Datei zu machen und alle Varianten mit einer bedingten Logik in diese csproj importieren zu lassen. Dadurch bleiben die Quelldateien vom Haupt-csproj aus editierbar und sie werden in alle Varianten eingebaut. Jetzt versteht Visual Studio, was ich versucht habe, aber MonoDevelop kann es nicht erstellen. In der MonoDevelop-Lösung ist die iOS-Version der Kern-DLL ausgegraut und sagt "(nicht in aktiver Konfiguration eingebaut)"

Ich habe auch versucht, xbuilding mit csproj und solution zu erstellen, das die Probleme zu überwinden scheint, die MonoDevelop mit sich bringt, aber andere Dinge im Zusammenhang mit der Auflösung von monoTouch-Assemblys austricksen. Ich hatte gedacht MonoDevelop benutzt xbuild, aber vielleicht nicht?

Da dies im Windows-Msbuild funktioniert, scheint es, als wäre es entweder ein Fehler oder eine nicht unterstützte Funktion in Mono. Oder vielleicht gibt es einen besseren Weg, um das ganze Szenario anzugehen ... Dachte ich würde hier fragen.

Für Besonderheiten, Meine Core.iOS.csproj-Datei sieht folgendermaßen aus:

%Vor%

Und meine Core.csproj Datei sieht so aus:

%Vor%

Und, wie ich schon sagte, scheint eine Variation davon korrekt zu funktionieren, wenn Sie VS Express für WinPhone- und XBox360-Projekte verwenden. Ist das etwas, das funktionieren sollte? Gibt es einen besseren Weg, dies zu tun?

Danke,

    
Joe Castro 28.04.2012, 21:36
quelle

1 Antwort

9

Kurze Antwort:

Dies funktioniert nicht, da MonoDevelop zwar das MSBuild-Dateiformat verwendet, aber noch nicht die echte MSBuild / xbuild-Engine für alle Projekttypen verwendet. Ich würde vorschlagen, anstelle eines Includes Links zu verwenden.

Vollständiger Hintergrund:

MonoDevelop hat eine alte interne Build-Engine, die von der SharpDevelop 1.0-Build-Engine abgeleitet wurde, d. h. sie ist älter als die Existenz von MSBuild. Wir sind gerade dabei, zu MSBuild zu migrieren, dies hat jedoch mehrere Phasen durchlaufen und ist noch nicht abgeschlossen.

Vor einigen Jahren hat MonoDevelop sein Projekt Dateiformat auf eine Visual Studio-kompatible Untergruppe von MSBuild umgestellt. Dies erfolgte durch Serialisierung / Deserialisierung bekannter MSBuild-Eigenschaften und -Elemente in das interne Projektmodell von MD, wobei jedoch der Build mit der alten Build-Engine ausgeführt wurde. Dies bedeutete, dass alle MSBuild-Projekte, die nur Funktionen verwendeten, auf die über die Visual Studio-Benutzeroberfläche zugegriffen werden konnte, problemlos funktionierten. Die erweiterten MSBuild-Funktionen, auf die nur durch manuelle Bearbeitung von MSBuild-XML zugegriffen werden kann, wurden jedoch nicht unterstützt.

Späteres MD erhielt experimentelle Unterstützung für die Verwendung der Build-Engine xbuild / MSBuild, aber zu der Zeit, als xbuild noch nicht ausgereift war und keine MSBuild-Ziele für alle Projekttypen enthielt. Es blieb experimentell, und Build-Code für neue Projekttypen (MonoTouch usw.) wurde mit der internen MD-Build-Engine geschrieben.

Mono für Android musste in Visual Studio unterstützt werden und musste MSBuild-Ziele haben. Anstatt Build-Code für zwei Build-Engines zu schreiben und zu pflegen, haben wir die Integration der xbuild- und MonoDevelop-MSBuild-Engine abgeschlossen, sodass sie für Mono-Projekte für Android verwendet werden kann. Allerdings konnten wir die Xbuild-Build-Engine nicht standardmäßig in MD aktivieren, da viele andere Projekttypen noch keine Xbuild-Ziele hatten. Stattdessen haben wir Projekt-Add-Ins zugelassen, um die Verwendung der xbuild-Engine pro Projekttyp zu erzwingen.

Dies ist im Wesentlichen der aktuelle Status - die xbuild-Engine wird für Mono für Android-Projekte und neuere Projekttypen wie iPhone-Bindungsprojekte und PLP-Projekte verwendet und wird für neue Projekttypen empfohlen. Ältere Projekttypen wie MonoTouch, MonoMac, ASP.NET usw. wurden jedoch zum Zeitpunkt des Schreibens noch nicht migriert.

    
Mikayla Hutchinson 30.04.2012, 03:48
quelle

Tags und Links