包(BPL)自动命名后缀

19
我为Delphi编写了许多组件和库,其中大部分需要使用BPL打包才能安装到IDE中。
这很简单,并且可以很好地工作,直到您想要维护一组包项目文件(在单个项目组中),但是还希望为不同的Delphi版本编译和分发这些相同的包。
迄今为止,我为每个Delphi版本创建了一个不同的Package Project,并显式地定义了Delphi版本标识符作为后缀(例如Kinect_XE.bpl和Kinect_XE2.bpl)。
我知道,在包项目的“项目选项”下,“描述”中有“LIB前缀”和(对于我的需求更为重要的)“LIB后缀”字段。
我进一步了解到,如果我在“LIB后缀”中放置一个值,它将附加到编译后的BPL文件名的末尾。
我的问题是,首先是否有可能让IDE自动使用IDE / RTL版本号填充“LIB后缀”字段,如果可以...如何实现?
我相当肯定这是可能的,因为似乎vcl120.bpl(及其各自版本的对应项)可以作为要求引用您自己的软件包,仅使用vcl而不必键入完整的vcl120。事实上,我希望实现的就是这种行为...我的软件包可以相互引用(如果需要),而无需提供特定于版本的引用以适应后缀。
同样重要的是,解决这个问题将使我能够在单个项目组中维护一组项目文件(除了XE2,因为它的项目文件由于“平台”添加可能与Delphi的旧版本不兼容)。

我怀疑我需要在LIB后缀字段中放置像$(VER)(或类似的内容),但这似乎不起作用,我已经搜遍谷歌寻找正确的解决方案。

希望你能帮忙!

更新1

我现在正在编写一个IDE插件,可用于(至少)Delphi 2007到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以统一整个过程!


2
当我尝试访问它(已登录)时,我会收到“要么没有报告#83229,要么您无权查看该报告”的提示。 - LaKraven
抱歉,这是私人报告。我会将内容添加到我的回答中。 - Uwe Raabe
@UweRaabe:看起来这份报告是私有的。你有没有可能将它公开呢?因为我也无法查看它,但如果可以的话,我会投票支持它。 - Marjan Venema
1
@Marjan:http://qc.embarcadero.com/wc/qcmain.aspx?d=83229 - Uwe Raabe
@UweRaabe:谢谢!我通过桌面QC客户端投票,这样我可以给它10票(通过Web客户端您最多只能给10票)。 - Marjan Venema
显示剩余5条评论
4个回答

7
据我所知,对于Delphi XE2及以下版本,没有自动化完成此操作的方法。
关于"requires"子句:当您要求使用另一个包时,实际上是使用了DCP文件,而DCP文件不继承LIBSUFFIX。因此,在编译时仅需要要求使用“VCL.dcp”,而在运行时实际上使用的是“VCL160.bpl”。DCP文件包含完整的BPL名称以解决该问题。
这使得LIBSUFFIX方法优于简单的“为每个Delphi版本重命名包”的方法。
QC83229中建议的解决方案可以更轻松地将包移植到新的Delphi版本中,但是您仍然无法向后兼容dproj文件。
我通常为每个Delphi版本使用不同的文件夹,只存储项目文件。对于新的Delphi版本,我只需复制一个文件夹并更改LIBSUFFIX即可。

@Serg:是的,但目前是私有的。请查看问题的评论。 - Marjan Venema
我正在构建一个插件来解决这个问题! - LaKraven

3

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

例如,您可以编写:

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

糟糕的是,IDE不会尊重您在*.dpk文件中手动编辑的内容,并且在您更改包时删除它们。这就是为什么一些使用*.dpk文件中条件定义的组件供应商在安装说明中建议如果被要求保存更改,请选择“NO”的原因。

此外,这些指令应该位于包源码的底部,因为直到 contains 结束之前,System 才不在作用域内。 - OnTheFly
5
在Delphi中,整个软件包的安装过程非常麻烦。在Delphi 7中,您只需要两个文件来获取软件包信息(*.dpk和*.res),但现在却有三个文件,而且有冗余,一个文件已经足够了。不幸的是,Embarcadero并没有在意这个问题。 - kludg
.DPROJ文件是MSBUILD(和“Galileo”IDE)所需的,而DPR则由Delphi编译器使用。这肯定是令人烦恼的重复! - LaKraven
1
@Serg 我正在开发(并将公开发布)一个插件,用于自动管理DPROJ文件中指定的后缀值,至少支持Delphi 2007到XE2版本。当然,这将支持切换功能(因此您可以通过项目管理器的BPL / DLL项目上下文菜单轻松地打开/关闭自动添加后缀)。 - LaKraven
正如我在编辑后的答案中所写(被拒绝)...如果您将指令放置在它们自己的单元中,并将该单元作为包的一部分简单地包含在其中...这个特定问题就会被解决(并被Galileo IDE(2005及更高版本)替换为更严重的问题)。 - LaKraven
显示剩余5条评论

2
我的建议是将此项添加为项目选项集的可配置选项(请参见QC#86491)。与更新所有软件包相比,只需更新单个选项集文件即可。
实际上,在Delphi XE / XE2中,选项集文件识别DllSuffix标签。在选项集文件的<PropertyGroup>部分中添加<DllSuffix>160</DllSuffix>将导致后缀添加到项目管理器中的软件包。但是,您仍然需要打开项目选项并单击“确定”才能将其保存到.dpk文件中。
我同意这个功能非常有用(我认为RTL中的软件包也是如此)。

0

{$LIBSUFFIX AUTO} 功能在 Delphi 10.4.1 中新增:

在之前的版本(10.3 及更早版本)的 C++Builder 和 Delphi 中,构建包的开发人员需要手动设置其包的库后缀设置。DocWiki“版本 10.4.1 中的新功能”提到了一个新的 IDE 项目选项,用于设置库后缀:

“Package AUTO libsuffix:现在,包可以具有自动版本后缀,而不是每次发布新版本时手动更新和指定正确的版本后缀。(编译器在 10.4 中悄悄支持此功能,但完全支持该功能的 IDE 和包项目设置是在 10.4.1 中引入的。)”

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接