【问题标题】:Package (BPL) Automatic Naming Suffix包 (BPL) 自动命名后缀
【发布时间】:2012-02-06 04:51:49
【问题描述】:

我为 Delphi 编写了很多组件和库,其中大部分都需要使用 BPL 打包,以便它们可以安装到 IDE 中。

这很简单而且效果很好,直到您想要维护一组包项目文件(在单个项目组中),但还想为不同的 Delphi 版本编译和分发这些相同的包。

到目前为止,我一直在为每个 Delphi 版本创建不同的包项目,并明确定义 Delphi 版本标识符作为后缀(例如 Kinect_XE.bplKinect_XE2.bpl )。

我知道,在包项目的项目选项中,描述下有LIB前缀和(更多重要的是我的需要)LIB 后缀

我进一步知道,如果我在 LIB 后缀 中放置一个值,它将被附加到已编译 BPL 文件名的末尾。

然而,我的问题首先是是否可以让 IDE 自动使用 IDE/RTL 版本 号填充 LIB 后缀 字段,如果可以的话。 ..怎么样?

我相当确定这是可能的,因为似乎可以引用 vcl120.bpl及其对应的每个 Delphi 版本)(如要求)您自己的包只使用 vcl 而不必输入完整的 vcl120。事实上,这正是我希望实现的相同行为……我的包可以相互内部引用(必要时),而无需提供特定于版本的引用来容纳后缀。

同样重要的是,解决这个问题将使我能够在单个项目组中维护一组项目文件(XE2 明显例外,其项目文件不一定与以前版本的 Delphi 表现得很好,因为平台添加)。

我怀疑我可能需要在 LIB 后缀 字段中输入像 $(VER) (或类似的东西)这样的值,但这似乎不起作用并且我在 Google 上搜索了正确的解决方案。

希望你能帮忙!

更新 1

我现在正在编写一个 IDE 插件,用于(至少)Delphi 2007 to XE2,它为 DLL 和 BPL 项目提供了一个名为 AutoSuffix 的新选项.当切换On 时,任何安装了 AutoSuffix 插件的 IDE 都会立即将正确的 IDE 版本后缀应用到项目中。

AutoSuffix 插件将在接下来的 24 小时内(免费)提供给所有人,并相应更新此问题。

更新 2

好的... Delphi 2007 很痛苦!到目前为止,我已经让 AutoSuffix 与 2009 到 XE2 一起工作,但 2007 需要更多时间(请耐心等待)。

更新 3

Embarcadero 似乎听到了我们集体呼吁在版本之间实现更简单的包统一。

Mark 将推动这一点,看看 Delphi 的未来版本是否可以容纳 {$LIBSUFFIX AUTO} 功能。我希望很快能收到回复,是否会是这样。如果是这样,它肯定会影响 AutoSuffix 在 XE2 和旧版本上的工作方式(因为目前它不提供简单的 AUTO 开关。它有自己的方法)。

我现在希望 EMB 会认真对待这个请求,将其作为一个完整的功能提供,以便它成为一个简单的案例,在现有版本上使用 AutoSuffix 来统一整个流程版本!

【问题讨论】:

  • 不是编译器版本,而是 IDE/RTL 版本。
  • 正确...已相应编辑!我犯了一个愚蠢的错误!
  • 我得到要么没有报告 #83229,要么您无权查看该报告。当我尝试访问它时(登录)
  • 抱歉,私人报告。我将内容添加到我的答案中。

标签: delphi package bpl


【解决方案1】:

从 Delphi 到 XE2 的 AFAIK 没有自动执行此操作。

关于 requires 子句:当您 require 另一个包时,您实际上是在使用 dcp,它不继承 LIBSUFFIX。因此,在编译期间需要 VCL.dcp 就足够了,而在运行时实际使用 VCL160.bpl。 DCP 包含完整的 BPL 名称以解决该问题。

这使得 LIBSUFFIX 方法优于简单的“为每个 Delphi 版本重命名包”方法。

QC83229 中建议的类似解决方案可以更轻松地将软件包移植到较新的 Delphi 版本,但您仍然会遇到不向后兼容的 dproj 文件。

我通常为每个 Delphi 版本使用不同的文件夹,其中只存储项目文件。对于新的 Delphi 版本,我只需复制一个文件夹并更改 LIBSUFFIX。

【讨论】:

  • @Serg:是的,但暂时是私有的。见 cmets 提问
  • 我正在构建一个插件来解决我们所说的问题!
【解决方案2】:

LIBSUFFIX 指令在 *.dpk 文件中,您可以手动编辑 *.dpk 文件。

你可以写,例如

{$IFDEF CONDITIONALEXPRESSIONS}
   {$IF CompilerVersion = 20.0}
{$LIBSUFFIX '120'}
   {$IFEND}
   {$IF CompilerVersion = 21.0}
{$LIBSUFFIX '140'}
   {$IFEND}
{$ENDIF}

坏事是 IDE 不尊重您对 *.dpk 文件的手动编辑并删除它们,然后您在包中进行更改。这就是为什么一些在 *.dpk 文件中使用条件定义的组件供应商在要求保存更改时在安装说明中说“否”。

【讨论】:

  • 也存储在属性名称DllSuffix 下的.dproj 文件中。我不知道哪个设置获胜以及为什么重复。
  • 此外,这些指令应该在包源的最底部,因为 System 直到 contains 结束才在范围内。
  • 在Delphi中整个包的安装简直就是地狱。使用 Delphi 7,您有 2 个用于包信息的文件(*.dpk 和 *.res),现在您有 3 个文件,有重复,尽管 1 个文件绰绰有余。不幸的是,Embarcadero 不在乎。
  • MSBUILD(和“Galileo”IDE)需要 .DPROJ 文件,因为 Delphi 的编译器使用 DPR。当然,这是一个令人讨厌的重复!
  • @Serg 我正在为 至少 Delphi 2007 到 XE2 制作(并将公开发布)一个插件,以自动管理 DPROJ 文件中指定的后缀值。当然,这将支持切换(因此您可以通过 BPL/DLL 项目的项目管理器的上下文菜单轻松打开/关闭自动后缀)。
【解决方案3】:

我的建议是将其作为可配置选项添加到项目选项集(请参阅QC #86491。)与其更新所有包,更新单个选项集文件就足够了。

事实上,DllSuffix 标签似乎被 Delphi XE/XE2 中的选项集文件识别。将<DllSuffix>160</DllSuffix> 添加到选项集文件的<PropertyGroup> 部分将导致在项目管理器中将后缀附加到包中。但是,您仍然需要打开项目选项并单击“确定”才能将其保存到 .dpk 文件中。

我同意这个功能非常有用(我认为 RTL 中的包也是如此。)

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 2012-08-13
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2020-10-16
    • 2012-10-18
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多