7

这个问题与这个问题相似,但不是重复的,因为我问的是该问题中未讨论的问题。

我在 Delphi 7 中有一个客户端-服务器项目,其目录结构如下:

\MyApp
  \MyClientApp
  \MyServerApp
  \lib

有 2 个实际的 Delphi 项目 (.dpr),MyClientApp 和 MyServerApp 文件夹中各有一个。

lib 文件夹具有 .pas 单元,这些单元具有客户端和服务器应用程序的通用代码。我想知道是否应该在客户端和服务器项目中包含这些 .pas 文件?或者我应该在包含这些单元的 lib 文件夹中创建一个包?还是我应该将 .pas 文件留在 lib 文件夹中而不将它们添加到任何应用程序/包中?

每种方法的优缺点是什么?哪种方式是“最好的”?将 lib 文件夹中的这些单元包含在多个项目中是否有任何问题?

现在 lib 文件夹中的单元不是任何应用程序/包的一部分。这样做的一个缺点是,例如,当我在 Delphi 中打开我的客户端应用程序,并且我想在项目的所有文件中搜索某些内容时,它也不会在 lib 文件夹中的单元中搜索。我通过打开这些单元并在所有打开的文件中进行查找或使用 grep 搜索来解决此问题(但我更喜欢更好的解决方案)。

我也非常喜欢一个解决方案,当我对 lib 文件夹中的这些文件进行更改时,我不必去打开一些单独的包并重新编译它(这是我应该使用项目组的地方吗?)。

4

5 回答 5

8

在应用程序之间共享单元总是存在在一个应用程序中完成的不兼容更改会破坏另一个应用程序的风险。另一方面,制作这些单元的副本更糟糕,因此您将它们移动到自己的子目录的方法至少增加了在不考虑其他程序的情况下更改它们的心理障碍。

至于将它们添加到项目文件中:我通常将一些我经常从 IDE 访问(用于扩展或供参考)的单元添加到项目中,而将其他单元留给编译器使用搜索路径进行选择。我在每个项目的基础上这样做,这意味着一些单位可能是几个项目的一部分,为什么不呢?

将它们放入一个包中才有意义,如果您真的想创建一个基于包的应用程序,否则,何必费心呢?

有关我如何组织项目和库的更多信息,请参阅http://www.dummzeuch.de/delphi/subversion/english.html

于 2009-02-13T07:38:40.803 回答
5

我不喜欢项目共享文件。很多时候,您会很想编辑其中一个共享文件,并且您会破坏另一个项目中的某些内容,或者您​​会忘记您必须重新构建另一个项目。

当共享文件被分离到它们自己的库(包)中时,编辑它们就会有一些额外的障碍。我认为这是一件好事。这将提醒您正在从项目特定代码切换到共享代码。您可以使用项目组让您将所有项目都放在一个 IDE 实例中。将库项目安排在可执行项目之前。“build all”命令将从第一个项目开始按顺序构建所有内容。

将 DCU 文件与 PAS 文件分开。您可以通过设置“DCU 输出目录”项目选项将包的单元发送到其他位置来轻松完成此操作。然后将该目标目录放在您其他项目的“搜索路径”上。他们会找到 DCU,但不会找到 PAS 文件,因此没有其他项目会意外地重新编译不是真正成员的单元。

拥有一个单独的包也会阻止使用项目特定的条件定义。当您在项目之间共享单元时,这些会导致各种麻烦。找到一种方法,将所有特定于项目的选项保留在各个项目中。共享库不应该需要特定于项目的修改。如果一个库需要根据使用它的人而采取不同的行动,那么使用库用户可以设置的回调函数等技术来修改库的行为。

于 2009-02-13T00:19:06.553 回答
4

我需要有充分的理由将共享代码添加到包中。如果您只有几个共享文件,请将它们全部粘贴到名为 Shared 的目录中。这应该清楚地表明文件在项目之间共享。

还要使用一个好的构建工具来进行自动构建,这样如果你破坏了一些东西,你就会很快发现。

.bpl 文件适用于组件,但会严重增加此类事情的复杂性,除非您有大量共享文件。

于 2009-02-13T11:02:19.847 回答
3

我通常创建一个包含所有共享单元的包,然后只使用这些单元。如果您没有明确标记“使用运行时包构建”,则包内容(所有使用的 dcu)将作为任何其他单元链接到您的项目。

于 2009-02-13T00:04:26.103 回答
2

如果您实际上有两个应该在同一物理机器上运行并且共享一些代码的二进制文件,我只会使用运行时包。请记住,运行时包主要是一种全有或全无的方法。一旦您决定使用它们,您将不再能够将 RTL 和 VCL 单元直接链接到您的项目中,而是必须单独部署它们。

但是,当与我正在做的项目组结合使用时,包可能仍然是解决您问题的好方法。我讨厌在多个项目中包含共享单元。在包中包含共享单元(但不使用运行时包编译您的实际项目)允许您将该包添加到您的项目组中,这样您(和 IDE!)将始终让它们易于访问,但与特定于项目的项目很好地分开代码。严格来说,您甚至不必编译这些包。他们只能作为项目经理中的一个组织单位。

请注意,对于在文件中查找,您还可以指定“在项目组中的所有文件中”

于 2009-02-13T15:44:42.553 回答