2009-03-24 2 views
5

Während der Programmierung in C# mit Visual Studio 2008 wünsche ich mir oft "automatische" Code-Generierung. Wenn möglich, möchte ich dies erreichen, indem ich meine MSBuild-Lösungsdatei an Rake weiterleiten lasse, die Ruby-Code für die Codegenerierung aufrufen würde, wobei die resultierenden generierten Dateien automatisch in meiner Lösung erscheinen würden.Jeder hat Erfahrung, Rake von MSBuild für Code gen und andere Vorteile aufzurufen? Wie ist es gelaufen? Was sind deine Gedanken/Empfehlungen?

Hier ist ein Geschäftsbeispiel (von vielen möglichen Beispielen, die ich nennen könnte), wo diese Art der automatischen Code-Generierung hilfreich wäre. In einem kürzlichen Projekt hatte ich eine Schnittstelle mit einigen Eigenschaften, die Dollarbeträge enthielten. Ich wollte eine zweite Schnittstelle und eine dritte Schnittstelle, die dieselben Eigenschaften wie die erste Schnittstelle hatten, außer dass sie mit einem Geschäftseinheitsnamen "qualifiziert" waren. Etwas wie folgt aus:

public interface IQuarterlyResults 
{ 
    double TotalRevenue { get; set; } 
    double NetProfit { get; set; } 
} 

public interface IConsumerQuarterlyResults 
{ 
    double ConsumerTotalRevenue { get; set; } 
    double ConsumerNetProfit { get; set; } 
} 

public interface ICorporateQuarterResults 
{ 
    double CorporateTotalRevenue { get; set; } 
    double CorporateNetProfit { get; set; } 
} 

In diesem Beispiel gibt es eine "Consumer Business Unit" und eine "Corporate Business Unit". Jede Eigenschaft von IQarterlyResults wird in ICorporateQuarterlyResults zu einer Eigenschaft mit dem Namen "Corporate" + [Name der Eigenschaft], ebenso wie IConsumerQuarterlyResults.

Warum Schnittstellen für diese, anstatt nur eine Instanz von IQuartlerResults für Consumer und eine andere Instanz für Corporate? Bei der Arbeit mit dem Taschenrechnerobjekt, das ich erstellte, musste der Benutzer mit 100en Eigenschaften umgehen, und es ist viel weniger verwirrend, wenn er mit "vollqualifizierten" Eigenschaftsnamen wie "ConsumerNetProfit" umgehen kann.

Aber lassen Sie uns in diesem Beispiel nicht stecken bleiben. Es ist nur ein Beispiel und nicht die Hauptfrage.

Die wichtigste Frage ist diese: ich für die Codegenerierung Ruby und ERB Liebe verwenden, und ich liebe Rake mit Abhängigkeiten zwischen Aufgaben zu verwalten. Um das obige Problem zu lösen, möchte ich MSBuild zu Rake aufrufen lassen und Rake/Ruby die Liste der Eigenschaften auf der "Core" -Schnittstelle lesen lassen und dann den Code generieren, um alle abhängigen Schnittstellen und deren zu erstellen Eigenschaften. Dies würde jedes Mal ausgelöst werden, wenn ich einen Build mache, weil ich es in die MSBuild-Datei für die VS.NET-Lösung einfügen würde.

Hat jemand so etwas versucht? Wie ist es für dich gelaufen? Welche Erkenntnisse können Sie über Vor- und Nachteile, Erfolgstipps usw. austauschen?

Danke!

+0

Jeder? Bueller? (Ich mag MikeJs Antwort, aber er benutzte Nant anstelle von MsBuild). –

Antwort

1

Wir haben es mit Nant/Ruby + ERB gemacht - es erzeugt einen Ton von CRUD in unserem DAL und Dateneingabeformular Eingang für unsere Web-App. Für uns funktioniert es wirklich gut, aber es gab am Anfang eine Menge Setup-Zeit, die meinen Chef/Kunden nervös machte, weil sie dachten, wir sollten mehr Produktion als Prototyp zeigen.

Auch sicher sein, was die Generation tut - es gibt Unterschiede zwischen generieren & ändern und generieren + integrieren. generieren & ändern ist mehr wie mit einem Assistenten und ist einmalig. Wenn Sie + integrate generieren, müssen Sie verstehen, wo/wie Sie den generierten Code entweder durch Vererbung oder durch Bibliotheksaufrufe von handgeschriebenem Code in den generierten Code ausnutzen.

Ruby/erb ist nicht schnell ausgeführt. Eine Methode, um festzustellen, wann Sie/nicht generieren müssen, ist hilfreich, da die Kompilierungszyklen langsam und unproduktiv werden. Wir fanden es auch hilfreich, immer einen kleinen Testfall zu erstellen, um sogar einen einzigen Satz von Artefakten zu erzeugen, bevor Sie ihn in den Workflow integrieren - Sie haben einen Test des Produkts und es verlangsamt niemanden, während Sie am cg-Element arbeiten).

Ich würde lesen Jack Herrington Code Generation in Action wie es in Richtung Ruby ausgerichtet ist. Es hat mich in CG gebracht.

Ich würde auch Kathleen Dollards Code Generation in Microsoft .NET rea. Es wurde für die Verwendung von XSLT entwickelt, aber die Prinzipien sind die gleichen für die Entwicklung der Metadata-, Transformations- und Integrationsphasen. Ihre Artikel sind auch hilfreich, die Sie in Zeitschriften und im Internet finden.

+0

Danke. Ich stimme überein zu wissen, wann nicht etwas regeneriert werden muss, da ERB nicht schnell ist. Das ist, was ich in der Mischung für Rake will. Ich möchte die Abhängigkeiten der verschiedenen Stadien in Rake ausdrücken. Danke für die Information. Ich hoffe immer noch, dass jemand es von MSBuild aus getan hat (aber ich habe euch +1 gegeben). –

+0

Ich würde annehmen, dass Sie die Aufgabe in msbuild bauen können - etwas, um mit meinem freien Tag am Freitag zu brennen. – MikeJ

+0

Ah, arbeiten Sie für Google? –

0

Ich wollte das einfach rauswerfen (obwohl ich bezweifle, dass es eine Antwort auf die Frage sein wird, sollte es gehen Informationen), aber es gibt ein paar gute CodeGen-Tools, die einige ziemlich starke Visual Studio-Integration haben kann viel von dem, was du willst. Offensichtlich Sie suchen ein Ruby-Tool, aber für diejenigen gibt, die Ruby nicht vertraut sind, sollten Sie einige der anderen Werkzeuge:

1

I Rake verwenden zu erzeugen Konfigurationsdateien, die mit ERB templatiert werden. Das, was zu tun ist, die Projektdatei bearbeiten, um ein Before Ziel einzufügen, die Harke ruft ähnlich:

<Target Name="BeforeBuild"> 
    <Exec Command="rake name_of_my_template_processing_task" /> 
</Target> 

Siehe msbuild exec task docs und a blog post on pre-build events. Sie müssen in dem Befehl Attribute:

  • liefern den Pfad rechen, wenn es nicht in der Pfadumgebungsvariable ist bereits
  • das Arbeitsverzeichnis Attribut gesetzt, wenn Sie sie brauchen aus einem bestimmten Verzeichnis
  • Versorgung laufen a -r-Argument und der Pfad zum Rakefile, wenn Sie Rake nicht aus dem Verzeichnis ausführen, in dem sich Ihr Projekt befindet.
Verwandte Themen