代码之家  ›  专栏  ›  技术社区  ›  santiagoIT

Delphi中的自动依赖关系编译

  •  1
  • santiagoIT  · 技术社区  · 12 年前

    我对德尔福生态系统很陌生。我正在使用Rad Studio XE2。

    假设我有一个非常简单的案例。

    项目A、B和C。 C依赖于B。 B依赖于A。

    这也是我使用“项目依赖项”IDE GUI设置依赖项的方式。

    C是生成可执行文件的项目。它被设置为“当前项目”。

    如果我修改项目B中的一个文件并点击F5(运行),我希望只有项目B和C可以编译。

    然而,项目A总是重建的!!即使我修改了项目C中的源文件,情况也是如此。

    我做错什么了吗?如果是的话,有什么想法吗?

    或者这只是IDE的工作方式?

    一个客户有一个很大的遗留代码库,并且使用XE2。目前,他们正在手动处理依赖项目的重新编译,方法是右键单击需要重新编译的最低项目,然后选择“从这里构建…”。

    当我在XE2中发现“项目依赖项”功能时,我认为这将是解决这个问题的方法。

    *编辑*

    好的。我会试着更好地解释这一点,因为我发现我的问题/担忧并没有真正解决。

    我有一个组项目,它由许多BPL项目(据我所知,这些项目输出一个DLL)和一个可执行项目:C.exe组成。

    C.exe引用了所有的BPL项目,包括A.BPL和B.BPL。 现在,如果我修改任何BPL项目中的代码并只执行“Run”,C.exe将启动,但我刚才所做的更改将不会生效,因为BPL项目没有重新编译。这实际上是我的痛点。到目前为止,我使用的所有IDE都会重新编译依赖的dll。当然,假设项目设置正确。现在是我的问题。我不知道是项目设置不正确,还是这是IDE的限制。 如果我右键单击修改后的BPL项目,选择“从这里编译”,然后执行“运行”,我的更改将生效。然而,当我习惯于只运行可执行文件而不必担心重新编译依赖项时,不得不这样做是很烦人的。

    如上所述,我确实尝试使用IDE的“依赖项”功能。然而,这种行为(对我来说)很奇怪。它将重新编译依赖项,即使它们的源代码没有被修改。

    3 回复  |  直到 10 年前
        1
  •  4
  •   Uwe Raabe    12 年前

    你的期望是错误的。文件中写道:

    项目>依赖项

    在项目组中创建项目依赖项。从列表中选择要生成的项目,然后再生成选定的项目。

    你看到的行为是故意的。

        2
  •  2
  •   John Thomas    12 年前

    首先,你说“F5(跑步)”。现在是F9。。。

    其次,您的系统可能存在时间问题。DCU被一个过程或类似的事情所触动。

    第三,你可以把目录搞砸。您已经:

    Tools|Options
    Environment Options|Delphi Options|Library-Win32
        (1) "Library Path:" Edit Box
        (2) "Debug DCU Path:" Edit Box
    

    此外,打开您的项目

    Project | Options
    Directories/Conditionals
    (3) Search Path: Edit Box
    

    看看你是否有问题。此外,尝试删除 全部 来自各地的DCU(另请参阅Temp目录等)。此外,如果您有DPK、BPL aso。尝试通过创建一个名为“隐藏”(或其他)的子文件夹来“隐藏”它们。之后,如果需要,修复项目A、B和C的(输出)目录结构,并对所有内容进行新的构建。之后,看看问题是否仍然存在。

    第四,你可以有一个在C和A中都使用的单元。如果你“为项目C”更改它,当然它会触发A的重建。

    祝你好运

        3
  •  1
  •   Warren P    12 年前

    对于具有复杂构建依赖关系的项目,我通常只需制作一个外部构建脚本,并按照已知的工作顺序构建。也就是说,我不是纯粹在IDE中工作,而是简单地转到命令提示符并键入 build 和我写的一个批处理文件(build.cmd),负责清理以前的DCU,运行 msbuild 多次构建我需要构建的所有东西,这样我就有了可重复的、易于构建的产品。

    在开发其中一个项目时,我可能会在IDE中工作一段时间,但对于这些情况,我总是返回命令行构建。

    Delphi IDE的依赖系统是一个可悲的小黑客。命令行构建并不是一个真正的C风格的make系统,当涉及Delphi时,它更像是一个每次都要进行强力完全重建的解决方案。然而,由于这是持续集成(在服务器上运行时)通常要做的事情,而且当你继续处理另一个项目时,你可以运行这样的命令行构建,我发现这是一种可行的方法,可以“不再担心依赖性问题和构建订单”,这是我的根本问题。