我需要知道是否有任何选项可以仅在源或任何使用的单元、包等已更改的情况下编译 Delphi 项目。
如果这是不可能的,第二种选择:是否有任何选项可以生成完全相同的二进制文件,编译两次相同的项目。
编辑:用于基于哈希的 WebUpdate。
Delphi“编译”将仅编译更改的单元。但如上所述,单元有数据,因此编译器可以检查哪些需要更新,哪些不需要。并且可执行文件可能会更改,因为构建过程可以重新排列 exe。您的网络更新不应使用文件哈希,而应使用版本信息来决定更新哪些内容和不更新哪些内容。这就是安装程序检查应替换哪些文件的方式。
Delphi 仅编译编译时更改的单元,并编译所有单元,无论构建时的更改状态如何。
在二进制层面上,Exe 永远不会相同。刚刚构建了一个项目两次,将 exe 重命名为 txt 扩展名,并将它们与 Beyond Compare 进行比较:它显示了差异。
一个(困难)解决方案:使用 Makefile 制作你的 exes! makefile 允许您说“这个 exe 是使用这些命令从这些文件生成的”。仅当您列出的组成 exe 的文件中至少有一个比您的 exe 新时,Make 才会运行“那些命令”。
其中最困难的部分是设置组成 exe 的文件列表:您可以轻松获取 DPR/DPROJ 中列出的文件列表,但您还需要识别所有链接的资源 ($R) 、所有包含的文件 ($INCLUDE)、所有由 Delphi 隐式编译的文件,因为它们在“uses”子句中使用并且可以在库路径中找到。
为一般情况生成 Makefile 非常困难,但对于某个特定项目来说可能可行。例如,您可能认为您的文件仅依赖于 DPR 文件中列出的文件,然后确保将所有相关文件添加到 DPR。