来之不易的经验告诉我,几乎所有内容都属于源代码控制。(我的评论在用专用硬件(有时很难找到)的专用硬件上为嵌入式/电信系统开发了十五年之久。)
这里的一些答案是“不要将二进制文件放入源代码管理中”。错了 当您使用包含大量第三方代码和大量供应商提供的二进制库的产品时,请检入二进制库。因为,如果您不这样做,那么在某个时候,您将要升级,并且会遇到麻烦:由于构建机器没有最新版本,因此构建中断。有人给新家伙要安装的旧CD;项目Wiki关于要安装哪个版本的说明过时;更糟糕的是,如果您必须与供应商紧密合作以解决特定问题,并且他们在一周内向您发送五套库,则您必须能够跟踪哪组二进制文件表现出哪种行为。源代码控制系统是一种可以完全解决该问题的工具。
这里的一些答案是“不要将工具链放在源代码控制中”。我不会说错,但是最好将工具链放在源代码管理中, 除非您拥有坚如磐石的配置管理(CM)系统。同样,请考虑上述升级问题。更糟糕的是,我在一个项目中工作,当我被录用时,有四种不同的工具链在浮动- 所有这些都在积极使用中!我要做的第一件事(在设法建立好工作之后)将工具链置于源代码控制之下。(建立可靠的CM系统的想法超出了希望。)
当不同的项目需要不同的工具链时会发生什么?举例:几年后,其中一个项目从供应商那里获得了升级,所有的Makefile文件都损坏了。原来他们依靠的是GNU make的较新版本。所以我们都升级了。哎呀,另一个项目的Makefiles都坏了。课程:提交两个版本的GNU make,并运行项目签出随附的版本。
或者,如果您在一个其他所有事情都无法控制的地方工作,那么您会遇到诸如“嘿,新人从今天开始,编译器的CD在哪里?”这样的对话。“ Dunno,自从Jack辞职以来没有见过它们,他是CD的监护人。” “呃,那不是在我们从二楼上楼之前吗?” “也许他们在盒子里或其他东西里。” 由于工具已经使用了三年,因此没有希望从供应商那里获得旧CD。
您所有的构建脚本都属于源代码管理。一切!一直到环境变量。通过在项目根目录中执行一个脚本,您的构建机器应该能够运行任何项目的构建。(这./build
是一个合理的标准;./configure; make
几乎是一样好的。)脚本应根据需要设置环境,然后启动构建产品的任何工具(make,ant等)。
如果您认为这工作太多,那就不是。它实际上节省了大量工作。您可以在开始时提交一次文件,然后在每次升级时提交文件。没有孤独的狼可以升级自己的计算机并提交大量依赖某些工具最新版本的源代码,从而破坏了其他所有人的构建。雇用新开发人员时,您可以告诉他们签出项目并运行./build
。当1.8版具有许多性能调整功能,并且您需要调整代码,编译器标志和环境变量时,您要确保新的编译器标志不会意外地应用于1.7版补丁程序版本,因为它们确实需要代码随之而来的变化,或者您看到一些繁琐的比赛条件。
最棒的是,这将有一天节省您的钱:假设您在星期一发布产品的3.0.2版本。万岁,庆祝。在星期二早上,VIP客户致电支持热线,抱怨您18个月前发布的版本2.2.6中的超临界紧急漏洞。而且您仍然必须按照合同提供支持,并且他们拒绝升级,直到您可以确定该错误已在新代码中得到确定为止,并且它们足够大,足以使您跳舞。有两个平行的Universe:
在Universe中,您在源代码管理中没有库,工具链和构建脚本,也没有坚如磐石的CM系统。...您可以签出正确的代码版本,但是它提供了尝试构建时会出现各种错误。让我们看看,我们是否在5月升级了工具?不,那是图书馆。好的,回到旧的库中,等等,有两次升级吗?嗯,看起来好些了。但是现在,这种奇怪的链接器崩溃看起来很熟悉。哦,那是因为旧的库无法使用新的工具链,这就是我们必须升级的原因,对吗?(我将为您省去其余工作的痛苦。这花了两个星期的时间,最后没有人高兴,不是您,不是管理层,也不是客户。)
在一切都在源代码控制中的Universe中,您检出2.2.6标记,在一个小时左右的时间内准备好调试版本,花一两天的时间重新创建“ VIP错误”,查找原因,然后进行修复。当前版本,并说服客户进行升级。压力很大,但不比发际线高3cm的其他宇宙差。
话虽如此,您可以将其扩展到太多:
- 您应该具有标准的操作系统安装,并且具有“黄金副本”。将其记录下来,可能是在源代码控制的README中,以便以后的世代都知道版本2.2.6和更早版本仅基于RHEL 5.3和2.3.0构建,而以后仅基于Ubuntu 11.04构建。如果您通过这种方式管理工具链比较容易,那就去做,只要确保它是一个可靠的系统即可。
- 在源代码管理系统中维护项目文档非常麻烦。项目文档始终领先于代码本身,在处理当前版本的代码时,处理下一个版本的文档并不少见。特别是如果您所有的项目文档都是二进制文档,则您无法进行差异化或合并。
- 如果您有一个控制版本中使用的所有版本的系统,请使用它!只需确保整个团队之间的同步很容易,以便每个人(包括构建机器)都从同一套工具中获益。(我正在考虑像Debian的pbuilder这样的系统以及对Python的virtualenv的负责任使用。)