Delphi专家中的第三方依赖项

3

我正在编写一个Delphi IDE专家,其中包含一些第三方依赖项(可视控件),我的问题是当此专家在目标计算机上安装时,这台电脑是否需要安装这些第三方组件?还是这些组件被嵌入到生成的BPL文件中了?

3个回答

4

如果您在包的requires子句中添加了任何软件包,则它们将依赖于这些软件包。然后是它们所要求的任何软件包,以此类推...

如果您将所依赖的单元嵌入到您的包中,则可以将其嵌入。

例如:

package Package1;

...

// Items in the section mean that your package
// will depend on the BPL of the other package
// Target machine must have the BPL's listed here.
requires
  rtl;  


// Unit's here mean that the code is in your
// package and not in another BPL
contains
  Unit8 in 'Unit8.pas';

end.

注意事项

  • 加载了包含相同名称单元的两个软件包。
  • 第三方组件的许可证,商业库通常无法重新打包为库。
  • 开发人员可能还想使用不同版本的第三方组件。您需要向这些开发人员提供源代码,以便他们可以重新链接您的专家。

避免问题的方法之一

  • 重命名使用的第三方单元。
  • 将重命名后的单元包含在您的包中。

我已经看到过很多次使用这种方法。

例如Castalia就这样做,并且建议在使用其开源Delphi词法分析器和解析器时采用此方法。


Robert,感谢您的回答。那么,如果我的项目有依赖于JVCL(jedi)控件的情况,即使目标机器上没有安装这些组件(JVCL),该专家是否仍能正常工作? - Salvador
@Salvador,包有点复杂。如果您不链接JVCL包,则单元将自动包含在您的项目中,然后可供IDE使用。当您尝试将包安装到IDE中时,IDE应该会抱怨多个项目中可用的不同单元。请参阅我的答案,了解为什么您不能安全地发布第三方BPL。 - Cosmin Prund
@Salvador,回答已更新,但是是的,你需要在目标机器上安装JVCL。除非你将JVCL单元(希望已更名)放置在你的包含区域内。 - Robert Love

3
正如Robert Love所说:依赖关系存在,
任何Delphi项目都可以设置为编译带有不带包。 项目|选项|包|选中或取消选中“使用运行时包构建”。
当您使用包进行构建/编译时,这意味着您没有嵌入来自包的代码,您将不得不分发您的专家所依赖的bpl。正如Robert所说:在选择此选项时,请注意有关重新分发的许可证。
当您使用不带包进行构建/编译时,第三方控件/库的代码将嵌入到您的可执行文件/dll中,这就是您需要分发的全部内容。

3

关于BPL专家:

如果您可以避免链接到第三方控件的设计时版本,而只使用运行时BPL,则可以将其作为您的专家与您一起合法地发布。

不幸的是,我不能保证您可以“安全地”发布它们,因为您正在处理其他Delphi开发人员:他们可能拥有相同的第三方软件包,但版本不同!对于普通应用程序,您可以简单地将BPL的版本安装到应用程序目录中,但是对于Delphi IDE来说,这种方法行不通,因为该应用程序就是IDE:IDE是加载和链接BPL的程序,它无法加载两个相同BPL的版本。您也无法替换用户的版本,因为他们需要保留已经许可的版本,即使您的版本更新也不行!

解决方案:DLL专家:

一个可能的解决方案是将您的专家编译为DLL而不是包,并静态链接所有依赖项。这样,您就不再依赖于用户的第三方控件版本。


我该如何生成一个DLL专家?我需要在我的DPK文件的项目选项中设置属性吗?还是我需要创建一个新的DLL项目? - Salvador

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