2009-03-24 7 views
5

Visual Studio 2008を使用してC#でプログラミングする際に、私はしばしば "自動"コード生成を望みます。可能であれば、MSBuildソリューションファイルをRakeに呼び出すことで、コード生成のためにRubyコードを呼び出し、生成されたファイルが自動的に私のソリューションに表示されるようにすることで、実現したいと考えています。誰かがMSBuildからコードジェネレーションやその他の利点のためにRakeに電話をした経験がありますか?どうだった?あなたの考え/勧告は何ですか?

このような自動コード生成が役立つビジネス上の例がいくつかあります。最近のプロジェクトでは、私はドル金額を含むいくつかのプロパティとのインターフェイスを持っていました。私はビジネスユニット名で「修飾」されていることを除いて、第1インタフェースと同じプロパティを持つ第2インタフェースと第3インタフェースを必要としていました。このような何か:この例では

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

は、「消費者のビジネスユニット」と「企業ビジネスユニット」があります。 IQuarterlyResultsのすべてのプロパティはICorporateQuarterlyResultsの "Corporate" + [プロパティ名]というプロパティになり、IConsumerQuarterlyResultsも同様のプロパティになります。

なぜ消費者向けのIQuarterlyResultsと企業向けのインスタンスが存在するのではなく、これらのインターフェイスを作成するのはなぜですか?なぜなら、私が作成した電卓オブジェクトを使って作業するとき、ユーザーは100種類のプロパティに対処しなければならず、 "ConsumerNetProfit"のような "完全修飾"プロパティ名を扱うことができればはるかに混乱することはありません。

この例では、うんざりすることはありません。これは単なる例であり、主な質問ではありません。

主な質問はこれです:私はコード生成のためのRubyとERBを使用して愛し、私は、タスク間の依存関係を管理するために熊手を使用して大好きです。上記の問題を解決するには、MSBuildにRakeを呼び出して、Rake/Rubyに「コア」インターフェイスのプロパティのリストを読み込ませ、すべての依存インターフェイスを作成するためのコードを生成させます。プロパティ。 VS.NETソリューション用のMSBuildファイルに入れておくと、ビルドを行うたびにトリガされます。

誰もがこのようなことを試みましたか?どのようにあなたのために働いたのですか?長所、短所、成功のヒントなどについて、どのような洞察を共有できますか?

ありがとうございます!

+0

誰でも?ブエラー? (私はMikeJの答えが好きですが、彼はMsBuildの代わりにNantを使っていました)。 –

答えて

1

私たちはNant/ruby​​ + ERBでそれを行いました。私たちのウェブアプリケーション用のDALとデータ入力フォームにCRUDの音色を生成します。私たちにとってはうまくいっていますが、初めにセットアップ時間がかなりかかっていましたので、私は上司/顧客を緊張させました。

また、世代が何をしているかを確認してください - &の生成と生成+積分の間に違いがあります。 &を生成します。変更はウィザードを使用するようなものであり、オフです。 + integrateを生成するときは、継承を介して、または手書きコードから生成されたコードへのライブラリ呼び出しを通して、生成されたコードをどこで/どのように悪用するかを理解する必要があります。

Ruby/erbは高速に実行されていません。コンパイルサイクルが長くて非生産的になるので、生成する必要があるかどうかを判断する方法が役立ちます。また、ワークフローに統合する前に、単一のアーチファクトセットを生成するために、常に小さなテストケースを構築することが有益であることがわかりました。製品のテストを行い、cg要素の作業中に誰かを遅くすることはありません)。

私は、Jack Herringtons Code Generation in Actionを Rubyに合わせて読みました。そのCGに私を入れました。

また、私はKathleen Dollards Code Generation in Microsoft .NETもお伝えします。 XSLTを使用するために構築されていますが、原則はmetdadata、変換および統合段階の開発にも同じです。彼女の記事は、あなたが雑誌やウェブ上で見つけることにも役立ちます。

+0

ありがとうございます。私はERBが速くないので何かを再生しないときを知っていることに同意します。それが私がRakeをミックスして欲しいものです。レイクのさまざまなステージの依存関係を表現したいと思います。情報をありがとう。それでも誰かがMSBuildからそれをやったと思っています(しかし私はあなたに投票しました+1)。 –

+0

私はmsbuildにタスクを構築することができます - 何か私は金曜日に私の自由な一日と燃えるものと仮定します。 – MikeJ

+0

ああ、Googleで働いていますか? –

0

私はちょうどそこにそれを投げたかったのですが(私はそれが質問への答えになるとは思っていませんでしたが、情報に行くはずです)、CodeGenのいくつかの優れたツールがあります。あなたが望むものの多くを行うことができます。もちろん、あなたはRubyのツールを探していますが、Rubyのに慣れていない人が出たもののために、他のツールのいくつかを検討している:

1

ERBを使用してテンプレート化された構成ファイル。やる事は次のように、熊手を呼び出すBeforeBuildターゲットを挿入するために、プロジェクトファイルを編集している:

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

msbuild exec task docsa blog post on pre-build eventsを参照してください。それはすでにPATH環境変数ではない場合、あなたはそれが特定のディレクトリから実行する必要がある場合

  • が供給
  • を作業ディレクトリの属性を設定熊手するためにパスを供給
    • :あなたはにコマンド属性に必要-r引数とプロジェクトのディレクトリからrakeを実行していない場合のrakefileのパス。
  • 関連する問題