【问题标题】:Auto rename compiled file in Delphi XE2Delphi XE2中自动重命名编译文件
【发布时间】:2013-11-20 17:52:33
【问题描述】:

我使用 Delphi XE2,并且我有一个名为 PGetBase 的项目。在这个项目中,有一个带有常量声明的模块。例如:

const
   FragH = 5;
   FragW = 4;
...

编译后,文件名为 PGetBase.exe。是否可以使构建文件的名称依赖于模块中声明的常量,例如PGetBase_5_4.exe,通过使用Post-Build event?

【问题讨论】:

  • 常量在什么情况下会改变?他们多久改变一次?您是否考虑过构建配置和编译器指令?
  • 编写构建后事件。
  • 当然可以。编写一个小型控制台实用程序,该实用程序将从单元中读取您的常量,然后相应地重命名 PGetBase.exe,然后在您的 Post-Build 事件中运行该小型控制台实用程序。
  • @KenWhite 这就是一个好的通用脚本规范派上用场的地方。无需编译脚本。极大地简化了维护。我的整个构建过程都是通过 Python 编排的。

标签: delphi delphi-xe2 post-build-event


【解决方案1】:

将项目添加到项目组,该项目组会创建一个使用相同单元并更改文件名的可执行文件。在 Post-Build 事件中构建并运行该可执行文件。

【讨论】:

  • 哇!一个优雅而透彻的想法!喜欢它! ...但您可能只是忘记重新编译重命名器。所以看起来“make renamer”不应该在项目组中,而是在项目的预构建事件中
  • @Arioch'最好的办法是不再需要重新命名
  • @Arioch 我选择在主项目的 Post-Build 事件中构建重命名器,因为当主项目的构建失败时,不需要重新编译重命名器。
【解决方案2】:

Microsoft Build 对 Pascal 语言一无所知,无法解析源代码。

但是,您可以将“5”和“4”提取到一些外部文本文件中。

const
   FragH = 
   {$I Frag_h.txt}
   ;
   FragW = 
   {$I Frag_W.txt}
   ;

然后制作一个简单的程序(或脚本:WSH、PowerShell 等),该程序将从构建后事件启动。 您的程序会读取这些文件并将 Delphi 制作的 PGetBase.exe 重命名为您想要的任何名称。

PS。当然,可以解析源单元以重新获得这些常量,而不是将它们卸载到外部存储中。评论保持讨论赞成与反对。

PPS。 NGLN 的想法很巧妙。您可以将该单元作为重命名器项目的一部分包含在内,而不是解析文件。然后您可以添加一个预构建事件,该事件将编译(制作)重命名器,并且在构建后重命名器本身将具有这些常量。虽然调用 make/dcc32 可能比仅从与版本无关的预编译 renamer.exe 中解析源代码要慢,但 NGLN 的方法很优雅,并且以自己的方式独立。

【讨论】:

  • 我想我会保留源代码并编写源文件解析脚本以提取常量。
  • @DavidHeffernan 是的,这也是可能的。但是如果你在程序中添加一些新的或复杂的东西会破坏解析器呢?愚蠢的解决方案通常是可靠的:-)
  • 当解析器中断时你修复它。以我的经验,这是很少见的。
  • 包含的响应文件确实更可靠。分析源代码将要求您迟早编写一个完全成熟的 Pascal 词法分析器。
  • 为什么你需要一个完整的词法分析器来找到这两个定义——通过一些约定,它们很容易用正则表达式找到。有时我们必须务实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2013-12-06
  • 2014-01-14
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多