最近,我开发并安装了带有自己组件的VlControls Delphi软件包。
现在,当任何计算机上的任何开发人员使用其他一年前的CmGUI程序包(早在VlControls之前存在)并尝试构建它时,会弹出以下窗口:
要使此程序包与其他已安装的程序包兼容,必须进行以下更改。 选择“确定”以应用这些更改并重建包。
添加VlControls。 VlControls包含隐式单元(一个或多个)TeeBlockCanvas,TeeMesh,TeeBlockEditor,TeeBlockGallery,TeeBlockClasses,TeeWater,TeeBlocks,TeeMakerConst,TeeLoadError,TeeTarga,TeeGLSLShaders,TeeViewBlock,TeeCamera,TeeMakerControl,TeePlayMP3,TeeTextureSelector,TeeMakerEditor,TeeSelectProperty,TeeClipBlock,TeePointEditor,Tee3DSFormat,TeeFacesBlock ,TeeObjFormat,TeeSubdivideMesh,TeePointItemEditor,TeeActionGallery,TeeSoundSelector,TeeMakerLibrary,TeeLoadBlock,TeeExtruded,TeeRoundRect,TeeMoveAnimation,TeeNumberAnimation,TeeExtrudedEditor,TeeActionAnimation,TeeBlockAnimations,TeeBlockReplacer,TeeHelix,TeeRain,TeeBlockFormat,TeePipe,TeeProperties,TeeDraw3DEditor,TeeKinematics,TeeColorPalette,TeeRevolutionEditor,TeeRevolution ,TeeAnimationGallery,VCLTee.TeeAnimateEditor,TeeTerrain,TeeEdgeStyle,TeeStairs,TeeChartBlock3DEditor,TeeChartBlock,TeeChart3D。
我不知道为什么会这样,因为两个包完全相互独立。 CmGUI中没有包含“VlControls”字符串的文件。两个包的共同点是Tee图表组件。
这只发生在这个CmGUI包中,其他旧包完好无损。
它可能是什么?
我正在使用Delphi 10。
CmGUI.dpk:
package CmGUI;
{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS OFF}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS OFF}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION OFF}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO OFF}
{$SAFEDIVIDE OFF}
{$STACKFRAMES ON}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DEFINE DEBUG}
{$ENDIF IMPLICITBUILDING}
{$IMPLICITBUILD ON}
requires
rtl,
vcl,
vclx,
dbrtl,
adortl,
tee923,
designide,
vclactnband,
dclstd,
OurPackageNumber1,
OurPackageNumber2,
vcltouch,
NxCommonRun_d10,
NxGridRun_d10,
TeePro923,
TeeUI923,
TeeImage923,
TeeGL923,
VclSmp,
vclFireDAC,
FireDACIBDriver,
FireDACPgDriver,
IndyProtocols,
NxCollectionRun_d10;
contains
//Here come units from this package only. No external units are included.
end.
VlControls.dpk:
package VlControls;
{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO OFF}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS OFF}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO OFF}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DEFINE RELEASE}
{$ENDIF IMPLICITBUILDING}
{$IMPLICITBUILD ON}
requires
rtl,
vcl,
vclimg,
vclx,
TeePro923,
TeeUI923,
Tee923,
DesignIDE,
TeeImage923,
TeeGL923,
dbrtl,
FireDAC,
FireDACCommonDriver,
FireDACCommon,
IndySystem,
IndyCore;
contains
//Here come units from this package only. No external units are included.
end.
更新
好的,我仔细查看了我的包并处理了它在编译时显示的所有警告。现在contains
部分包含以下单元:
TeeBlockCanvas,
TeeChart3D,
TeeChartBlock3DEditor,
TeeAnimationGallery,
TeeColorPalette,
TeeDraw3DEditor,
TeeProperties,
TeeBlockReplacer,
TeeEdgeStyle,
TeeLoadBlock,
TeeSoundSelector,
TeeActionGallery,
TeeMakerLibrary,
TeeMakerControl,
TeeCamera,
TeePointItemEditor,
TeeSelectProperty,
TeeTextureSelector,
TeeBlockFormat,
TeeSubdivideMesh,
TeePointEditor,
TeeGLSLShaders,
TeeLoadError,
TeeChartBlock,
TeeMesh,
TeeTerrain,
TeeMakerEditor,
TeeClipBlock,
TeeMoveAnimation,
TeeActionAnimation,
TeeBlockAnimations,
TeeNumberAnimation,
TeeKinematics,
TeeBlockEditor,
TeeBlockGallery,
TeeBlockClasses,
TeeViewBlock,
TeeExtrudedEditor,
TeeHelix,
TeeRevolution,
TeeRevolutionEditor,
TeeStairs,
TeeRain,
TeeWater,
VCLTee.TeeAnimateEditor,
TeePlayMP3,
Tee3DSFormat,
TeeObjFormat,
TeeFacesBlock,
TeePipe,
TeeExtruded,
TeeRoundRect,
TeeBlocks,
TeeMakerConst,
TeeTarga;
据我了解,下一步是查看每个单元并找出它所属的包,然后将包名添加到requires
部分,从contains
部分删除单位名称。
如果我没有*.pas
个文件,但只有*.bpl
和*.dcu
,如何找出该单元属于哪个包?
答案 0 :(得分:4)
显然你的包使用了TeeChart包中的很多单元(或几个包?我不太了解TeeChart)。 不要隐式导入,只需将 packages 放在{{1}中的显式单位(即contains
部分中明确指定的单位) }。section。
这不仅可以使您的软件包更加轻薄,还可以避免这种命名冲突。使用包含同名单位的其他包时,使用您的包的任何人都将面临命名冲突。这就是为什么IDE认识到其他软件包使用的所有或大多数软件包都在你的软件包中,建议链接到你的软件包。
如果您的包裹不包含这些单位,则不会发生这种情况。这就是为什么你应该始终,真的总是避免隐式导入单位。如果发生这种情况,您会收到警告(在编译程序包期间)。注意它。
示例(包requires
):
MyControls
和contains
MyUnit;
:
MyUnit
现在,unit MyUnit;
uses
TeeThis, TeeThat, TeeOther;
,TeeThis
和TeeThat
单元隐式链接到您的包中。但是如果你的包引用包含这些TeeOther
单位的其他包(比如TeeXXX
),编译器就不会将它们添加到你的包中,它将从TeeChart.bpl
包中间接使用它们(引用它们)。这使您的包更小,并允许其他包以相同的方式使用相同的TeeChart
单位。您和其他套餐之间不会出现与TeeXXX
单位相关的命名冲突。
TeeXXX
当然,这会给您带来负担,确保使用您的包的每个人都有TeeChart包,如果有必要,也可以通过分发该包(假设许可证允许)。
您的更新显示您现在拥有符合要求的TeeChart套餐。如果消息正确,编译器还包括单位requires
TeeChart,
etcetera;
,TeeBlockCanvas
,TeeMesh
,TeeBlockEditor
,TeeBlockGallery
等等。在你的包中,所以你明确包含的单位(在TeeBlockClasses
部分中)似乎也使用这些单位。将包含这些单位的包(可能是contains
,TeePro923
和TeeUI923
)放在Tee923
部分中:
requires
现在你不应该收到消息,所有这些单位都被隐含地包含在你的包中了。