在软件开发过程中,编译时间往往是一个令人头疼的问题。尤其是对于C/C++语言,编译过程可能非常耗时,导致开发效率低下。本文将介绍一种名为IncrediBuild的解决方案,它通过分布式编译技术,显著提高了编译效率,减少了开发者的等待时间。
对于许多开发者来说,编译时间是一个不可避免的挑战。无论是等待几个小时完成整个产品的构建,还是每天多次等待增量构建完成,都会让人感到沮丧,影响生产力,浪费宝贵的时间。尽管预编译头文件和硬件的改进在一定程度上改善了这种情况,但对于中大型软件项目来说,每年仍然会浪费大量的开发者时间在编译上。
IncrediBuild是由Xoreax Software公司开发的一款工具,它通过在网络中的工作站上分布式地分配编译任务,将编译时间缩短了90%甚至更多。IncrediBuild的“构建监控器”可以直观地显示分布式编译的进度,每个文件根据其编译器消息的严重程度进行颜色编码。
IncrediBuild基于点对点模型。在网络中的不同机器上安装一个名为“代理”的组件,同时有一个名为“协调器”的中央组件负责管理编译工作负载。当一个IncrediBuild代理用户启动构建时,远程机器上的代理被分配为该构建的编译资源。然后,这些代理编译源文件,并将构建输出返回到启动构建的机器上。最后,在启动构建的机器上执行链接。
协调器负责将不同的代理分配给当前运行的构建。它根据每个代理计算机的硬件规格、当前CPU可用性和其他参数,确保在任何时候构建都能利用最强大、最可用的代理。此外,当同时运行多个构建时,协调器的工作是将可用的计算能力平均分配给构建代理。
当作为远程构建的编译资源时,代理以低优先级进程执行编译任务,以保持计算机的响应水平。这通过协调器考虑每台机器的可用性,有效地分配较忙的机器最后执行(实际上,一旦机器达到一定的最小活动水平,它将立即停止任何远程编译活动)。最后,在任何给定时间,IncrediBuild代理用户可以临时禁用其机器上的代理,将机器资源保留在其他代理之外。
IncrediBuild构建可以通过三种不同的界面运行:
当运行IncrediBuild构建时,MSVC的标准输出显示被IncrediBuild的“构建监控器”替换。这个独特的显示包含了监控构建进度所需的一切,并且可以轻松定位警告/错误消息。分布式编译过程的可视化显示将每个编译的源文件显示为进度条,根据生成的编译器消息的严重程度进行颜色编码。构建输出可以为整个构建显示,也可以单独为每个配置显示。此外,构建进度条和轻松导航到下一个/上一个错误消息的额外功能使生活更加轻松。
在MSVC IDE中使用时,一个停靠的构建监控器窗口显示构建结果。这里显示的是构建监控器的每个项目配置输出视图,以及每个配置的构建进度条。
新用户对IncrediBuild最常见的担忧之一是:“怎么能确定构建会正确完成?”。这在跨不同环境、操作系统、安装的DLL和COM对象的机器上分发编译时尤其成问题。
IncrediBuild通过“虚拟环境”的概念来解决这个问题。在为远程代理编译时,IncrediBuild在构建机器环境的受保护的镜像中运行编译。这有几个好处。首先,每当编译器引用源文件、类型库、注册表项等时,它保证与构建机器上的类似操作完全相同。这也意味着IncrediBuild不需要任何手动配置即可工作,因为它将始终使用构建机器的环境。另一个好处是,IncrediBuild不使用机器的文件系统来存储远程源文件,而是使用自己的源文件缓存机制,避免了担心不同源文件版本出现在文件夹中的问题。
为了强调“虚拟环境”概念的深远影响,甚至用于远程编译的编译器版本也是从构建机器镜像的。实际上,要在仅用作编译资源的机器上使用IncrediBuild代理(而不是启动构建),不需要安装MS Visual C++,因为IncrediBuild总是会忽略本地安装的版本,而使用镜像版本。