【问题标题】:In Delphi, should I add shared units to my projects, to a shared package, or neither?在 Delphi 中,我应该将共享单元添加到我的项目、共享包中,还是都不添加?
【发布时间】:2009-02-12 23:10:49
【问题描述】:

这个问题类似于this one,但不是重复的,因为我问的是那个问题中没有讨论的问题。

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

\MyApp
  \MyClientApp
  \MyServerApp
  \lib

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

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

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

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

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

【问题讨论】:

    标签: delphi project-structure


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • package 根本不会被链接。它只会像任何普通构建一样链接 DCU 文件。
          【解决方案5】:

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

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

          注意,对于Find in Files,也可以指定“在项目组的所有文件中”

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-28
            • 1970-01-01
            • 2015-06-29
            • 1970-01-01
            相关资源
            最近更新 更多