我工作的公司用Delphi开发了一个系统,里面有几十个exe模块,每个exe模块在源代码上都有一定程度的相同。可悲的是,从来没有人关心使用库来放入共享代码。这意味着每次在所有这些模块共享的代码中需要修复错误时,程序员都必须单独对它们进行更正!总是要花很多时间...
我决定找到一种方法将共享代码放入库中。我考虑过 DLL 和 BPL。在这种情况下,BPL 似乎对程序员更友好,麻烦也更少,尤其是代码仅在我们的软件中使用,并且仅在 Delphi 中使用。
我将所有 exe 模块共享的所有代码放入 BPL 中,一切似乎都很好,但是有些事情我不明白,如果您向我解释,我将不胜感激。
在将代码划分为 BPL 之后,我所期望的是,使用我创建的 BPL 部署 exe 文件就足够了。但事实证明,他们也需要 rtl100.bpl 和 vcl100.bpl。为什么会这样?我只想部署 exe 和我的 BPL。我不想为最终用户提供由 Borland 和第三方公司提供的一大堆库:)。我希望它们像以前编译的那样在 exe 中编译。有可能这样做吗?
到目前为止我所做的是:
- 我将所有共享的 pas 单元放到 BPL 中。每个 BPL 都包含属于同一类别的单元,因此程序员很清楚在给定的 BPL 中期望什么代码。
- 每个 BPL 都是一个“运行时和设计时”库。
- 每个 BPL 都是“显式重建”的。后两者是 BPL 的默认项目设置。
如果涉及到 exe 项目:
- 我删除了之前放入 BPL 的所有单元。
- 我从 BDS 2006 中的 Tools->Install package 菜单安装了我的 BPL。
- 在我的 exe 项目设置中,我选中了“使用运行时包构建”选项,并在下面的编辑框中列出了我所有的 BPL 包(只有我的包,因为我清除了那里出现的所有其他包)。
这就是我所做的一切。exe 项目可以正确编译,但我无法访问 BPL 的源代码(我无法从我的 exe 项目中导航到该代码),即使所有 BPL 都与其源代码文件一起存储。为什么?我觉得很奇怪。
我总是倾向于写冗长的描述 - 对不起:)。我会感谢你的帮助。我只需要对我提到的几点进行几句解释:仅使用我的 BPL 部署 exe,我所做的整体工作的正确性,以及无法导航到 BPL 源代码。非常感谢您!
谢谢大家的讨论。有人说我选择的方法不是一个好主意。我们的软件由 100 多个模块组成(其中大部分是不同设备的驱动程序)。它们中的大多数共享相同的代码 - 在大多数情况下是类。问题是这些类并不总是放在单独的、独立的 pas 单元中。我的意思是共享代码通常被放入包含特定于模块的代码的单元中。这意味着当您修复共享类中的错误时,仅将其定义的 pas 单元复制到所有软件模块中并重新编译它们是不够的。不幸的是,您必须将固定的代码片段一个接一个地复制并粘贴到适当的单元和类中。这需要很多时间,这就是我想消除的,选择正确的方法 - 请帮助我。
我认为使用 BPL 将是一个很好的解决方案,但正如你们中的一些人所提到的,它有一些缺点。最糟糕的问题是,如果每个 EXE 需要多个 BPL,我们的技术支持人员必须知道哪个 EXE 需要哪些 BPL,然后为最终用户提供适当的文件。只要我们没有软件更新程序,这对我们的技术人员和最终用户来说都是一笔大买卖。他们肯定会迷路和生气:-/。
还可能发生兼容性问题 - 如果一个 BPL 由多个 EXE 共享,则对一个 BPL 的修改可能对一个 EXE 有利而对其他一些 EXE 不利 - @Warren P.
那么我应该怎么做才能在这么多项目中更快地修复错误?我想到了以下方法之一。如果您有更好的想法,请告诉我。
- 将共享代码放入单独和独立的 pas 单元中,因此当其中一个有错误修复时,将其复制到所有项目(覆盖旧文件)并重新编译所有项目就足够了。
就后面修改的代码而言,这个解决方案似乎没问题。但是我们也有具有通用功能和程序的 pas 单元,这些单元通常不需要修改——我们会在必要时添加新功能,但在单个项目中。所以想象一下,你在 100 个模块中的一个模块中编写了一个新函数,并将其放入它的通用单元中。一两个月后,您修改了一个不同的模块,并且您认为您需要两个月前编写的相同功能。您必须找到该模块(如果您不记得它是哪个模块,这很困难)并将该函数复制到您的代码中。并且很明显 - 只要将它们分别存储在每个项目中,每个模块中的通用单位就会变得完全不同。然后,如果有一个错误修复要做......整个故事重复。
- 为所有共享代码创建 BPL,但将它们链接到 EXE,以便 EXE 是独立的。
对我来说,这似乎是现在最好的解决方案,但有几个缺点。如果我在 BPL 中修复错误,每个程序员都必须更新他们计算机上的 BPL。如果他们忘记了怎么办?但是,我仍然认为这是一个小问题。如果我们注意互相通知变化,一切都应该没问题。
- @CodeInChaos:我不知道我是否理解正确。你的意思是在项目之间共享pas文件吗?怎么做?我们将源代码存储在 SVN 中。这意味着我们必须将共享代码存储在一个单独的文件夹中,并让所有项目都在那里搜索该代码,对吧?并从 SVN 下载一个项目及其依赖的所有文件夹......
请帮我选择一个好的解决方案。我只是不希望公司仅仅因为软件开发的愚蠢方法而在错误修复上浪费更多的时间和金钱。
非常感谢。