我正在尝试为我制作的自定义组件制作一个包。它基于几个库,包括Graphics32,GraphicEx和CCR.Exif。
我创建了一个 Package 项目,编写了包含其Register命令的单元,添加了一些额外的参考资料Delphi通知我关于 requires 部分(包括dbrtl.dcp,inet) .dcp,soaprtl.dcp,vclimg.dcp,xmlrtl.dcp和dclGraphicEx140.dcp)并在 contains 部分添加了许多单元,以避免隐式发生有关它的警告。该项目编译并可以在我自己的机器上安装和使用而不会出现问题。但是,当我想在另一台机器上安装它时,麻烦就开始了。最后,我不得不复制我使用的所有第三方组件的所有DCU,以及来自GraphicEx的DCP和BPL,我必须安装它。
提供大量文件是一个无赖,但可以克服,但不得不安装其他软件包是不行的。我可以通过在 contains 部分放置更多单元来摆脱DCP和BPL,但这导致我自己的机器上实际安装了GraphicEx的错误消息。这让我感到困惑,因为使用Graphics32就不会发生这种情况了......
无论如何,如何将我的分发保持在最低限度并避免这种情况?我希望我团队中的其他开发人员能够使用该软件包,而不必担心我用它来构建它。首先,不能将所有第三方单元编译到我自己的DCU中吗?
答案 0 :(得分:2)
对于编写组件的人来说,您所经历的是一件很平常的事情。分布总是那样。包裹不带其他包裹,他们引用它们。这是他们的本性。
为了克服这种情况,我总是以与销售产品相同的方式对待我的组件:我构建了一个设置向导,用于分发和注册软件包所需的所有内容。
在我的情况下,InnoSetup效果很好(http://www.jrsoftware.org/isinfo.php)。
答案 1 :(得分:0)
<强>摘要强>
暂时没有使用Delphi,但是,确实开发了我的自定义视觉控件(最后一个版本我工作的是Delphi 6)。
处理包依赖项时有2个问题。一种是在Delphi环境中安装,使得控件出现在组件面板上,以及组件编辑器和组件编辑器。财产编辑。
另一个是将已编译的软件包分发到客户机器中。
这还取决于您正在运行的Delphi版本。
设计时间
开发自定义程序包时,有一个用于程序包选项的选项卡,用于指示目标文件夹。
手册通常会告诉开发人员将这些文本框留空。这有时是有效的,有时则不然。我明确地在相应的文本框中写下每个文件夹路径。
“ .dcp”文件有一个文本框路径,“ .dcu”有其他文件路径,依此类推。
如果你有视觉控件和属性编辑器或组件编辑器之类的东西,最好将代码拆分为2个包(“Runtime”和“Designtime”)。
我通常把delphi(包)项目放在delphi安装文件夹之外。
运行时间
通常,快速方法是将“* .bpl”“。dcp”文件放在Windows(32)/ system文件夹或类似的“DLL”Windows文件夹中。
包文件夹结构源代码建议
管理包可能很困难。我不知道Embarcadero和新版Delphi的安装过程有多少变化。下面的图表是关于如何组织源代码的示例。希望它有所帮助。
[-]--+--c:
.....|
.....+--[-]--+--software
.............|
.............+--[+]-----java
.............|
.............+--[+]-----php
.............|
.............+--[-]--+--delphi (not the delphi folder in program files)
.....................|
.....................+--[+]-----apps (source code for delphi programs)
.....................|
.....................+--[+]-----other
.....................|
.....................+--[-]--+--packages (all delphi packages source code here)
.............................|
.............................+--[+]-----lib (a single package for non visual controls, libraries)
.............................|
.............................+--[+]-----tools (package pair for non visual tcomponent descendants)
.............................|
.............................+--[+]-----json (example)
.............................|
.............................+--[+]-----xml (example)
.............................|
.............................+--[-]--+--mycontrols (folder custom visual controls)
.............................|.......|
.............................|.......+--[-]--+--delphi40 (folder for delphi40 version of "mycontrols")
.............................|.......|.......|
.............................|.......|.......+----------dsgvclctrls40.dpk (design-time package "mycontrols")
.............................|.......|.......|
.............................|.......|.......+----------runvclctrls40.dpk (run-time package "mycontrols")
.............................|.......|.......|
.............................|.......|.......+--[+]--+--demos (individual example for each "mycontrol")
.............................|.......|.......|
.............................|.......|.......+--[+]--+--design ("*.pas" component editors destination folder)
.............................|.......|.......|
.............................|.......|.......+--[+]--+--sources ("*.pas" source code destination folder)
.............................|.......|.......|
.............................|.......|.......+--[+]--+--bin ("*.dcu" destination folder)
.............................|.......|........
.............................|.......+--[+]--+--delphi50 (folder for delphi50 version of "mycontrols")
.............................|.......|........
.............................|.......+--[+]--+--delphi60 (folder for delphi60 version of "mycontrols")
.............................|.......|........
.............................|.......+--[+]--+--delphi70 (folder for delphi70 version of "mycontrols")
.............................|................
.............................+--[-]-----etc...
干杯。
答案 2 :(得分:0)
Thijs,你只是不能用一个包来做到这一点。目标开发人员几乎需要您添加到包中的所有内容。但是有另一种方法可以做你想要的:用你自己组件中使用的所有组件/库构建一个DLL,并将所有这些外部组件/库包装到你将从DLL导出的代码中。然后直接构建组件,而不是直接使用外部组件,而是使用您构建的DLL。您不能在组件中“使用”其他外部组件/库的任何单元。您必须构建一个新单元,其中包含从DLL导出的所有数据类型和所需的声明。所有这些都非常有效,但对于大量外部组件或库来说,这将很快变得非常复杂。
答案 3 :(得分:0)
我认为AlexSC有最好的答案,但我认为如果你必须拥有一个没有依赖关系的自定义组件,可能会有另一种选择。
我在尝试为我们的开发人员创建内部组件的过程中遇到了Delphi依赖性的挫折。我的建议是:
卸载组件使用的所有依赖项
在您的组件包中,从包中的requires部分删除上面的dcp。
将依赖项的源文件复制到组件
当您分发组件时,您必须使用所需依赖项的代码对其进行说明
如果您想单独使用dependcies,则会遇到问题,因为Delphi不允许您在已安装的软件包中包含重复的单元名称。
此外,您不想使用DCU的原因是DCU是针对特定平台和编译器编译的。因此,除非您确定所有开发者都使用相同版本的Delphi在同一平台广告上,否则需要重新编译依赖关系代码。
同样,AlexSC有最好的答案,InnoStudio是一个很棒的小工具。