关于自动化:在自动化版本中管理生成代码的最佳方法?

关于自动化:在自动化版本中管理生成代码的最佳方法?

Best way to manage generated code in an automated build?

在我的自动NAnt构建中,我们有一个步骤(使用SubSonic)从数据库生成大量代码,并将这些代码分为与数据库中的架构名称匹配的文件夹。例如:

  • /生成代码

    • / dbo

      • SomeTable.cs
      • OtherTable.cs
    • / abc

      • 客户.cs
      • Order.cs

模式名称用于隔离应用程序所需的生成类。例如,有一个ABC应用程序,它将从此中央文件夹中提取生成的代码。我正在像这样的预构建事件上这样做:

del /F /Q $(ProjectDir)Entities\\generated*.cs

copy $(ProjectDir)....\\generated-code\\abc*.cs $(ProjectDir)Entities\\generated*.cs

因此,在每次构建时,Nant脚本都会运行生成器,该生成器会将所有代码放入一个中央存放区,然后启动解决方案构建...其中包括需要生成项目的每个项目的预构建事件类。

这就是我所看到的摩擦:

1)每个新应用都需要设置此预构建事件。必须要做的事真是太糟糕了。

2)在构建服务器中,我们不会生成代码,因此在每个命令之前我实际上都有一个IF $ {ConfigurationName)==" Debug",因此在发行版本中不会发生这种情况

3)有时命令会失败,这会导致本地构建失败。如果出现以下情况,它将失败:
-尚无生成的代码(仅建立一个新项目,尚无数据库)
-目录中没有现有代码(首次构建)

通常这些只是次要的修复,我们只是破解了一种方法来启动一个新项目或一台新机器并在构建中运行,但这阻止了我一键构建Nirvana。

因此,我想听听一些建议,以期改善它的耐用性。也许将代码复制到应用程序文件夹中移到NAnt脚本中?在我看来,这有点倒退,但我愿意为此倾听。

好的,开火:)


您的数据库架构多久更改一次?

是否无法按需生成与数据库相关的文件(例如,当模式更改时),然后将其检入代码存储库?

如果数据库模式不变,则还可以打包已编译的* .cs类,并将存档分发到其他项目。


是的,我想将VS排除在等式之外,以便从VS构建只是简单地编译代码和引用。

我可以管理NAnt脚本...我只是想知道人们是否对拥有1个NAnt脚本有建议,或者每个项目可能有一个建议可以将代码推送到项目中而不是被拉走。

这确实意味着您必须选择加入才能生成代码。


我们的解决方案中有两个项目完全由生成的代码构建而成。基本上,我们将代码生成器.exe作为另一个项目的后构建步骤运行,并与生成代码一起使Visual Studio的活动实例自动化,以确保生成的项目在解决方案中,并且具有所有内容。生成的代码文件,并根据需要将它们检出/添加到TFS。

它在VS自动化阶段很少脱落,我们必须"手动"运行它,但这通常仅在您打开多个VS实例且其中> 1个解决方案实例打开且无法计算的情况下应该自动执行哪一个。

我们的解决方案和过程使得在我们进行自动构建之前,应该始终完成并正确进行生成,因此这种方法可能对您不起作用。


推荐阅读