一个Delphi软件包被错误地检测为依赖于其他软件包

时间:2017-08-31 12:28:34

标签: delphi

最近,我开发并安装了带有自己组件的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,T​​eeColorPalette,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,如何找出该单元属于哪个包?

1 个答案:

答案 0 :(得分:4)

显然你的包使用了TeeChart包中的很多单元(或几个包?我不太了解TeeChart)。 不要隐式导入,只需将 packages 放在{{1}中的显式单位(即contains部分中明确指定的单位) }。section。

这不仅可以使您的软件包更加轻薄,还可以避免这种命名冲突。使用包含同名单位的其他包时,使用您的包的任何人都将面临命名冲突。这就是为什么IDE认识到其他软件包使用的所有或大多数软件包都在你的软件包中,建议链接到你的软件包。

如果您的包裹不包含这些单位,则不会发生这种情况。这就是为什么你应该始终,真的总是避免隐式导入单位。如果发生这种情况,您会收到警告(在编译程序包期间)。注意它。

示例(包requires):

MyControls

contains MyUnit;

MyUnit

现在,unit MyUnit; uses TeeThis, TeeThat, TeeOther; TeeThisTeeThat单元隐式链接到您的包中。但是如果你的包引用包含这些TeeOther单位的其他包(比如TeeXXX),编译器就不会将它们添加到你的包中,它将从TeeChart.bpl包中间接使用它们(引用它们)。这使您的包更小,并允许其他包以相同的方式使用相同的TeeChart单位。您和其他套餐之间不会出现与TeeXXX单位相关的命名冲突。

TeeXXX

当然,这会给您带来负担,确保使用您的包的每个人都有TeeChart包,如果有必要,也可以通过分发该包(假设许可证允许)。

更新

您的更新显示您现在拥有符合要求的TeeChart套餐。如果消息正确,编译器还包括单位requires TeeChart, etcetera; TeeBlockCanvasTeeMeshTeeBlockEditorTeeBlockGallery等等。在你的包中,所以你明确包含的单位(在TeeBlockClasses部分中)似乎也使用这些单位。将包含这些单位的包(可能是containsTeePro923TeeUI923)放在Tee923部分中:

requires

现在你不应该收到消息,所有这些单位都被隐含地包含在你的包中了。