任何人都有从MSBuild调用Rake获取代码和其他好处的经验吗?怎么回事?你有什么想法/建议?

Cha*_*ers 5 c# ruby msbuild rake code-generation

使用Visual Studio 2008在C#中编程时,我经常希望"自动"生成代码.如果可能的话,我想通过让我的MSBuild解决方案文件调用Rake来实现它,Rake会调用Ruby代码来生成代码,生成的文件会自动出现在我的解决方案中.

这是一个业务示例(我可以命名的许多可能的示例),这种自动代码生成会有所帮助.在最近的一个项目中,我有一个包含一些包含美元金额的属性的界面.我想要第二个接口和第三个接口,它们具有与第一个接口相同的属性,除了它们是"合格"的业务单元名称.像这样的东西:

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; }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,有一个"消费者业务部门"和一个"公司业务部门".IQuarterlyResults上的每个属性都成为ICorporateQuarterlyResults上名为"Corporate"+ [property name]的属性,同样也是IConsumerQuarterlyResults的属性.

为什么要为这些接口创建接口,而不仅仅是为Consumer提供IQuarterlyResults的实例,为Corporate提供另一个实例?因为,在使用我正在构建的计算器对象时,用户必须处理100个属性,如果他可以处理"完全限定"的属性名称(例如"ConsumerNetProfit"),那就不那么容易混淆了.

但是,在这个例子中,我们不要陷入困境.这只是一个例子而不是主要问题.

主要问题是:我喜欢使用Ruby和ERB来生成代码,我喜欢使用Rake来管理任务之间的依赖关系.为了解决上面的问题,我想做的是让MSBuild调用Rake,并让Rake/Ruby读取"核心"接口上的属性列表,然后生成代码以生成所有相关接口及其属性.每次进行构建时都会触发这个,因为我将它放入VS.NET解决方案的MSBuild文件中.

有没有人尝试过这样的事情?它是如何为你工作的?您可以分享哪些见解,包括优缺点,成功秘诀等等?

谢谢!

Mik*_*keJ 1

我们使用 Nant/ruby+ERB 做到了这一点 - 它在我们的 DAL 中生成 CRUD 音调,并为我们的 Web 应用程序输入数据输入表单。对我们来说,效果非常好,但一开始有大量的设置时间,这让我的老板/客户感到紧张,因为他们认为我们应该展示比原型更多的产品。

还要确定生成正在做什么 - 生成和修改与生成 + 集成之间存在差异。生成和修改更像是使用向导,并且是一次性的。当您生成+集成时,您需要了解在哪里/如何通过继承或通过从手写代码到生成代码的库调用来利用生成的代码。

Ruby/erb 执行速度不快。确定何时需要/不需要生成的方法很有帮助,因为编译周期开始变得漫长且低效。我们还发现,在将其集成到工作流程之前,始终构建一个小型测试用例来生成甚至一组工件是很有帮助的 - 您对产品进行了测试,并且在处理 cg 元素时它不会减慢任何人的速度)。

我会阅读 Jack Herrington 的《Code Generation in Action》,因为它是针对 Ruby 的。它让我进入了 CG 领域。

我还想了解 Kathleen Dollards Microsoft .NET 中的代码生成。它是为使用 XSLT 而构建的,但开发元数据、转换和集成阶段的原理是相同的。您在杂志和网络上找到的她的文章也很有帮助。