【发布时间】:2012-05-10 07:17:37
【问题描述】:
我对自动化构建流程和持续集成还很陌生,并且正在为一个小型开发团队设置构建流程/服务器。我们正在使用 SVN、CMake 和 Jenkins 构建服务器。源语言为 C++。
假设我们有两个项目,library(一个 dll)和executable。 executable 链接到 library,因此要构建 executable,您需要来自 library 的 .lib 和 .h 文件。要运行executable,您需要library 的.dll(可能还有调试符号文件)。
在构建整个东西时,它相当简单,您从存储库中获取最新源并构建library 然后executable。
但是,我们有多个开发人员,每个开发人员通常一次处理一个项目。我们的 CMake 脚本允许您选择要构建的项目,因此 John 的设置可能仅构建 executable,而 Bob 仅构建 library。放弃这不是一种选择。
所以如果Bob 对library 进行更改并提交源代码,John 将需要获取已编译的 .lib 和 .dll 文件(因为他没有编译 library)。
现在,二进制文件在 svn 中。在每次编译期间,CMake 将 src/bin 复制到 build/bin 作为预编译步骤,然后编译选择的任何项目(替换 build/bin 中的适当二进制文件),最后 CMake 将 build/bin 复制到 src/bin。
这意味着当Bob 进行更改时,他不仅会提交源文件,还会提交编译后的二进制文件,当John 更新他的工作副本时,他会获得适当的二进制文件,而不必这样做任何手动文件替换。
这已经有一段时间了,但我真的不喜欢它有几个原因。是否有更少的黑客方式来设置这样的东西? (实际上有4个开发者,大概有12个项目,有些是不依赖任何东西的库,有些是依赖其他库的库,还有一些是依赖其他库的可执行文件。)
编辑:这是我正在考虑的过程:
使用 Artifactory 或 Nexus 等工件跟踪系统在构建后存储二进制文件以及用于生成这些二进制文件的头文件
在 CMake 中,每个项目都被标记为已编译或预编译。编译的项目是从常规存储库生成的。如果预编译的项目二进制文件和标头已过期,则会从 Nexus 下载它们,并且 CMake 会适当地链接和包含。标题也与工件一起保存,以防止我在对 Dave Bacher 的回答的评论中描述的竞争条件。
我唯一不喜欢的是我必须做一些 CMake-foo 来检查工件是否过时并下载它们,但我想没有真正的替代方案,因为显然我我正在尝试设置是如此不标准。
【问题讨论】:
-
为什么不是每个开发人员都有自己的构建版本?在您的示例中,在 Bob 的更改之后,John 为什么不在结帐时重建他需要的库?
-
部分是因为它给 VS 的解决方案资源管理器和构建输出增加了很多混乱,并且在每次编译期间增加了一点时间接触所有项目。但主要是因为这已经有一段时间了,而且权力已经决定了它不会改变:-\
标签: svn build-process cmake jenkins build-automation