使用MS Build,Delphi的构建自动化和持续集成可行吗?

22
我希望实现一个持续的单元测试运行系统,这就是我听说过的“smoketest”或“tinderbox”,(一个构建服务器,可以对给定源代码库或项目中的所有内容进行干净的版本控制检出和完整的系统构建),以及类似于Delphi的小团队的“持续集成”。我不想使用商业“构建服务器”产品,希望能够只用内置在Delphi中的MS-Build支持来完成大部分工作。我正在寻找资源、思路和入门的地方。我不知道如何将MS Build用于此目的。Steve Trevethen有一篇博客文章,介绍了一些关于旧的dcc32命令行构建的讨论,并提到了自2007年起就存在的ms-build。我正在使用Delphi 2010。我正在寻求指导和见解,以及经验,告诉我,这是一个合理的路径吗?如果不是,我应该选择哪条路线呢?我发现可以使用/msbuild命令行覆盖Unit(DCU)和EXE输出目录,方法是/p:DCU_DcuOutput=。请注意,我查看了我的DPROJ文件中的XML,以弄清楚如何覆盖一些东西。但是,它只执行make操作,而不是构建操作,/t:rebuild无效(编辑:是的,它可以在DPROJ文件上很好地工作,但不能在GroupProjects上工作)。

我希望能够在任何地方找到更多关于使用Delphi进行MSBuild的文档?“Rad Studio 2010”产品文档中的MS-Build帮助只介绍了一两个有关MS-Build的内容,而且非常简略和不完整。

相关问题:

MSBuild命令行


离题了,但我们使用Cygwin makefiles和dcc32来处理这样的事情。原因是我们大多数项目都源自Delphi 5及更早版本的世界,所以我们只坚持我们熟悉的东西...但它运行良好且免费。 - Paul-Jan
/t:rebuild 对我来说是一个完整的构建,使用 Delphi 2009 处理 dproj 文件,您是否尝试在 dproj 上运行 msbuild 而不是 groupproj?https://dev59.com/WkrSa4cB1Zd3GeqPWW4e#1774169 - jasonpenny
尝试使用mingw的工具,与cygwin/msys相比,它可以节省很多路径麻烦。不幸的是,mingw似乎已经停止了coreutils的构建。 - Marco van de Voort
近年来,我开始使用“want”代替msbuild,为Delphi提供类似Java的“build.xml”(ant)工具。 wantnext项目页面:https://bitbucket.org/wpostma/wantnext - Warren P
3个回答

17

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构建。


1
到目前为止一切都很好,但是有些地方记录了,如果要进行构建而不是重新编译,我应该使用/t:rebuild。你知道强制进行构建而不是依赖项检查(又称make)的标志是什么吗? - Warren P
Lars注意到,对于.GroupProj文件,/t:Build有效,而对于.dproj文件,则需要使用/t:Rebuild。虽然有些古怪,但是可行的。 - Warren P
1
实际上,Build 是两者中的一个目标,并且可以执行您想要的操作:构建。ReBuild 是 .dproj 中的额外目标,并且在构建之前进行清理。 - Lars Truijens
4
使用msbuild在IDE之外存在一些问题需要注意:1)编译器不会增加构建号,而是由IDE完成,而且在IDE之外没有轻松的方法来设置它。2)预构建/后构建变量可能未设置为正确的值。 - user160694
“msbuild”未被识别为内部或外部命令、可操作的程序或批处理文件。我认为答案中缺少了一些东西。 - Ian Boyd
显示剩余2条评论

11
dproj和groupproj是msbuild文件,你可以查看它们的内容。其他信息可在msbuild安装路径(C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727)中找到。在那里,你会找到几个Borland.*.targets文件
在msbuild脚本中,你可以看到不同的目标名称为“target”。例如,groupfile包含Make、Clean和Build目标,你可以使用/t参数指定它们。dproj文件也有ReBuild目标,它执行Clean操作,然后执行Build操作。如果你想对groupfile实现相同的效果,可以指定两个目标:/t:Clean;Build
你还会发现许多参数,可以使用/p设置它们,例如Configuration指定配置或DCC_Quiet指示dcc32停止输出无用的空格等。
因此,从命令行使用Release配置执行构建的命令如下:
msbuild mygroup.groupproj /p:Configuration=Release /t:Build

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


1
知道你可以在 groupproj 上执行 /t:Build 是非常有帮助的。 - Warren P
1
@ldsandon:微软公司负责记录MSBuild;毕竟,这是他们的产品。也许您应该查看他们的网站-MSDN,以获取MSBuild参考 - Ken White
1
@Ken White:微软应该为MSBuild和BorCodeDero的*.targets文件提供文档,还是期望微软也会为它们提供文档? - user160694

4

我不确定这是否是您需要的,但我已经为Delphi 2009设置了CruiseControl.NET来进行持续集成和DUnit测试。 CCNET有一组特定的任务用于MSBuild,除了一些设置问题外,它对我来说完美地工作。

如果需要,我可以告诉您我必须做什么才能让它正常运行。

马克


你也试过 TeamCity 吗?它有一个免费的“专业版”许可证。 - mjn
我对CruiseControl.NET很感兴趣。请发布任何您拥有的“使用CruiseControl.NET的Delphi”信息链接。 - Warren P
你可以看看我的博客,我觉得那里有一些东西。如果没有,我肯定可以添加一些内容,因为我刚刚升级到了最新版本。 - mmmm
2
看看这个链接是否有帮助 - http://inpwtepydjuf.blogspot.com/2010/02/delphisurroundcruisecontrolnet-howto.html - mmmm
对于构建服务器,我们团队非常推荐TeamCity。我们使用它来进行Java和Delphi的构建,并发现它非常灵活。Hudson也不错,但需要更多的工作才能启动和运行。 - David Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接