我们使用微软的ActiveX/COM(VB6)技术开发了一个软件系统.在过去的一年里,我对自动化构建流程和SCM的整体兴趣越来越大.我仔细搜索了网络的大部分内容,以获取有关如何使用基于COM的软件系统进行scm的最佳实践的信息.
COM的"问题"是,引用组件通过唯一的接口ID保存引用.重新编译引用的组件时,id可能会更改,并且引用不再有效.这里的主要问题是,iid被编译成二进制文件.因此,当我不想将已编译的文件签入版本控制时,每个开发人员都必须编译他/她自己的版本并获取其他ID.
当我想在干净的构建机器上检查源代码来编译系统时,它是不可能的,因为所有引用都是无效的(没有二进制文件,没有接口ID).
我只是想知道,如果有一些最佳实践,如何为COM项目(VB6)设置自动构建系统?
编辑: 是的,我知道兼容性设置.但是采取这种情况,我想在没有任何二进制文件的干净构建机器上构建wohle系统.当您说项目是二进制兼容的时,您必须提供与项目兼容的二进制文件.
我想我必须编写一个自定义构建工具,它在编译项目之前和之后修改项目文件中的引用和兼容性设置.
因为VB6/COM是一种非常广泛的技术,我只是认为必须有一个随时可用的解决方案.
我们通常用二进制兼容性编译.当我们修改组件的公共接口时,我们使用项目兼容性进行编译.但是当您更改许多其他组件使用的基本组件的接口时,您必须手动将所有引用项目更改为项目兼容性,重新编译它们并更改回二进制兼容性.这是我想要自动化的主要过程.
您可以通过将项目的兼容性设置从"No Compatbility"更改为"Binary Compatibility"来告诉VB6重用GUID(IID的CLSID的LIBID等).您可以在Project-> Your-Project Properties 下找到这些设置.兼容性设置位于"项目属性"窗口的"组件"选项卡上.有三种选择:
没有兼容性
项目兼容性
二进制兼容性
以下是MSDN对他们的评价:
没有兼容性
使用此设置,不会强制执行兼容性.每次构建或编译项目时,Visual Basic都会创建新的接口ID和类ID.构建的每个版本只能与创建的应用程序一起使用,以使用该组件的特定构建.项目兼容性
使用此设置,可以使项目与特定组件项目兼容.生成新类型库信息时,将维护类型库标识符,以便测试项目仍可引用组件项目.此设置用于在测试期间保持兼容性.因此,一旦组件被释放,它的行为与无兼容性设置相同.
二进制兼容性
编译项目时,Visual Basic仅在必要时创建新的类和接口ID.它保留了先前版本的类和接口ID,以便使用早期版本编译的程序将继续工作.如果您进行的更改将导致版本不兼容,Visual Basic将警告您.如果要保持与较早发布的ActiveX组件版本的兼容性,则需要使用此设置.
听起来你正在编译没有兼容性.正如MSDN文章所述,您需要使用二进制兼容性来保持组件的较新版本与旧版本兼容.您现在可以通过执行以下操作来执行此操作:
使用No Compatibility编译每个项目一次
将这些"干净"版本保存到执行构建的人可以轻松访问的文件夹(例如网络共享),或者将它们放在源代码管理中.
返回并将所有项目更改为"二进制兼容性"并将"兼容文件"指向您刚刚保存在网络/源代码管理中的相应版本(不要将兼容文件指向您编译的同一路径兼容文件应该是原始组件的一个单独的副本,它不会改变.它只存在,以便VB可以在重新编译时将该文件的ID复制到你的项目中).
每次重新编译项目时,他们都将重用组件的兼容(原始)版本中的GUID.
编辑:正如Joe在评论中提到的那样,你还必须认识到你的类接口何时发生了变化(也就是说,当接口发生了足够的变化,你可以更长时间地保持与以前版本的二进制兼容性).发生这种情况时,您希望从以前版本的组件中彻底中断:重新编译新的"干净"版本(即无兼容性)并在将来的版本中将该新版本用作兼容文件.但是,重要的是要注意,只有在类接口(属性和方法)发生更改时才能重新开始.事实上,当项目不再与以前版本的组件兼容时,VB会发出警告.
在我工作的地方,我们倾向于(ab)在我们的大多数项目中使用No Compatibility,即使它不是真正正确的做事方式(你应该使用二进制兼容性).在我们公司,它被收购了懒惰,因为我们有一个自动构建工具,可以为我们编译所有项目,该工具的主要功能之一是可以自动修复项目之间的破坏项目引用.由于构建工具为我们修复了此问题,因此使用二进制兼容性的动机较少.
二元兼容性通常是更好的选择的几个原因:
微软这么说
如果所有组件都与以前版本的软件二进制兼容,则可以轻松地重新编译单个组件并将其重新分发给客户.这使得错误修正/补丁更容易部署.如果在项目中使用No Compatibility,则每次需要修补小补丁时都必须重新编译并重新分发整个应用程序,因为较新的组件(可能)不适用于较旧的组件.
您正在尽力维护COM标准:在COM中,类ID和接口ID应该唯一地标识类或接口.如果你的类和/或接口在构建之间没有改变,那么就没有理由为这些类和接口生成新的ID(事实上,那么同一个类将有多个ID).Binary Compatiblity允许您跨构建维护相同的ID,这意味着您是一个好公民并遵循COM约定.
减少注册表噪音.如果您始终将新组件部署到与旧版本不二进制兼容的客户,则每个新版本都会向注册表添加新信息.除其他外,每个新接口和类ID都必须注册.如果你保持Binary兼容的所有内容,那么安装程序只需要在一个地方添加注册表项,因为你的类ID和接口ID不会改变.
如果您正在公开其他第三方应用程序正在使用的公共API或组件,您肯定希望使用二进制兼容性,这样您就不会破坏依赖于您的代码的第三方软件.
Visual Build Pro.如果你仍然停留在VB6的土地上,并且必须建立专业产品,我强烈建议你研究一下这个产品.它有一个免费试用,值得每一分钱(加上它为.Net和其他平台的持续集成做得非常好.)自从我们开始使用它以来,它已经从我们的DLL地狱中拯救了我们.我不知道在VB6中创建一个像样的构建盒.