【问题标题】:Delphi Build Automation and Continuous Integration feasible using MS Build only?Delphi 构建自动化和持续集成仅使用 MS Build 可行吗?
【发布时间】:2010-02-22 18:32:30
【问题描述】:

我正在寻求实现一个连续的单元测试运行系统,我听说过称为“smoketest”或“tinderbox”的东西(一种构建服务器,它可以对给定的所有内容进行干净的版本控制检查和完整的系统构建)源存储库或项目),以及诸如使用 Delphi 的小型团队的“持续集成”之类的东西。

我不愿意致力于商业“构建服务器”产品,并希望我可以通过 delphi 中内置的 MS-Build 支持来做很多事情。

我正在寻找资源、想法和开始的地方。我不知道如何为此目的使用 MS Build。 Steve Trevethen 有一篇博文引发了关于旧 dcc32 命令行构建的一些讨论,一些 cmets 提到了自 delphi 2007 以来一直存在的 ms-build。我正在使用 Delphi 2010。我正在寻找指导和见解,和经验告诉我,这是一条合理的下坡路吗?如果不是,我应该走什么路?

我发现您可以使用 /p:DCU_DcuOutput= 从 msbuild 命令行覆盖单元 (DCU) 和 EXE 输出目录。请注意,我查看了 DPROJ 文件中的 XML 以了解如何覆盖内容。

但是,它只进行制作,而不是构建,并且 /t:rebuild 不起作用(编辑:是的。它在 DPROJ 文件上可以正常工作,但在 GroupProjects 上却不行。)

我希望任何地方都有更多 MSBuild-with-Delphi 文档? “Rad Studio 2010”产品文档中的 MS-Build 帮助显示了有关 MS-Build 的一两件事,但实际上很粗略且不完整。

相关问题:

MSBuild command lines

【问题讨论】:

  • Offtopic,但我们使用 Cygwin makefiles 和 dcc32 来处理这样的事情。原因是我们的大多数项目都源于 Delphi 5 和更早的世界,所以我们只坚持我们所知道的......但它工作正常并且是免费的。
  • /t:rebuild 为我做了一个完整的构建,在 dproj 文件上使用 Delphi 2009,您是否尝试在 dproj 而不是 groupproj 上运行 msbuild? stackoverflow.com/questions/1773546/…
  • 试试mingw的工具,比起cygwin/msys,省去了很多路径麻烦。不幸的是,mingw 似乎已经停止了 coreutils 构建
  • 近年来,我开始在 msbuild 之上使用“want”,它为 Delphi 提供了 java 风格的“build.xml”(ant)工具。 wantnext 项目页面:bitbucket.org/wpostma/wantnext

标签: delphi msbuild build-automation


【解决方案1】:

Delphi 2010 使用 MSBuild 作为它的主要构建引擎。这意味着 IDE 和命令行都做同样的事情。这也意味着您可以使用命令行轻松构建现有项目。事实上,我们 Delphi 团队一直在做同样的事情。您不必担心编译器本身的开关——IDE 创建的 DProj 文件将

开始菜单上有一个命令行,用于将 MSBuild 与现有的 Delphi 项目一起使用。它正确设置了环境,因此您可以简单地调用:

msbuild myproject.dproj

您还可以从命令行调用特定的构建配置,使用 IDE 使用 MSBuild 的命令行参数轻松创建所述配置。

如果您想自己创建环境,可以运行 rsvars.bat 批处理文件进行设置。该文件可以在您的 \bin 目录中找到,并且应该可以从默认命令行获得。

该文件包含以下内容:

@SET BDS=<your BDS directory>
@SET BDSCOMMONDIR=C:\Users\Public\Documents\RAD Studio\7.0
@SET FrameworkDir=C:\Windows\Microsoft.NET\Framework\v2.0.50727
@SET FrameworkVersion=v2.0.50727
@SET FrameworkSDKDir=
@SET PATH=%FrameworkDir%;%FrameworkSDKDir%;%PATH%
@SET LANGDIR=EN

因此,如果您想创建自己的持续集成构建,您可以使用 MSBuild 轻松管理您的 Delphi 构建。

【讨论】:

  • 到目前为止一切都很好,但是在某处记录了要进行构建而不是重新编译,我应该使用 /t:rebuild。知道强制构建而不是依赖检查(又名 make)的标志是什么?
  • 看起来 /t:rebuild 有效,但仅将 .dproj 传递给 msbuild,而不是项目组。这很好。对我来说只是多一点剪切和粘贴。
  • Lars 注意到 /t:Build 适用于 .GroupProj 而 /t:Rebuild 适用于 .dproj 文件。古怪,但可行。
  • 实际上,Build 是两者的目标,并且做你想做的事:Build。 ReBuild 是 .dproj 的一个额外目标,它在 Build 之前执行 Clean。
  • 请注意在 IDE 外使用 msbuild 时存在一些问题:1) 内部版本号是由 IDE 而非编译器增加的,并且在 IDE 之外没有简单的方法来设置它 2) Prebuild/ Postbuild vars 可能未设置为正确的值
【解决方案2】:

dproj 和 groupproj 是 msbuild 文件,您可以查看它们的内部。其他部分信息可在 msbuild 安装路径(C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727)中找到。在那里你会找到几个 Borland.*.targets 文件。

在 msbuild 脚本中,您可以看到以 .例如,组文件包含可以使用 /t 参数指定的 Make、Clean 和 Build 目标。 dproj 文件也是如此。 dproj 文件也有一个 ReBuild 目标。它先进行清洁,然后再进行构建。如果你想对 groupfile 有同样的效果,你可以指定两个目标:/t:Clean;Build

你还会发现很多参数都可以用 /p 设置。例如 Configuration 指定配置或 DCC_Quiet 指示 dcc32 停止输出无用的空格。

所以从命令行使用 Release 配置进行构建是这个命令:

msbuild mygroup.groupproj /p:Configuration=Release /t:Build

免责声明:我查看了 Delphi 2007 的 msbuild 文件。后来的 Delphi 版本可能更改了目标或参数的名称。只需查看 msbuild 脚本即可找出哪个是哪个。

【讨论】:

  • 知道你可以做 /t:Build on a groupproj 非常有帮助
  • @ldsandon:Microsoft 负责记录 MSBuild;毕竟,这是他们的产品。也许您应该查看他们的网站 - MSDN 以获取 MSBuild reference?
  • @Ken White:MS 记录 MSBUild,BorCodeDero 应该记录它的 *.targets 文件……还是希望 MS 也会记录它们?
【解决方案3】:

我不确定这是否是您需要的,但我有 CruiseControl.NET 设置用于为 Delphi 2009 进行持续集成和 DUnit 测试。CCNET 有一组特定的 MSBuild 任务,除了少数几个设置问题,它非常适合我。

如果您需要,我可以让您知道我必须做些什么才能使其正常工作。

标记

【讨论】:

  • 您也尝试过 TeamCity 吗?它有一个免费的“专业”许可证。
  • 我对 CruiseControl.NET 很感兴趣。请发布您拥有的任何“带有 CruiseControl.NET 的 Delphi”信息的链接。
  • 你可以看看我的博客,我觉得那里有东西。如果没有,我当然可以添加一些东西,因为我刚刚升级到最新版本。
  • 看看这个链接是否有帮助 - inpwtepydjuf.blogspot.com/2010/02/…
  • +1 将 TeamCity 作为构建服务器。我们将它用于 Java 和 Delphi 构建,并发现它非常灵活。 Hudson 也不错,但需要更多的工作才能启动和运行。
猜你喜欢
  • 2010-09-17
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2013-11-29
相关资源
最近更新 更多