【问题标题】:One Delphi package is falsely detected as depending from other package一个 Delphi 包被错误地检测为依赖于其他包
【发布时间】:2017-08-31 12:28:34
【问题描述】:

最近我开发并安装了带有自己组件的 VlControls Delphi 包。

现在,当任何机器上的任何开发人员使用其他早在 VlControls 之前就存在的一年前的 CmGUI 包并尝试构建它时,会弹出以下窗口:

为了使此软件包与其他已安装的软件包兼容,需要进行以下更改。 选择 OK 以应用这些更改并重建包。

添加 VlControls。 VlControls 包含隐式单元 TeeBlockCanvas、TeeMesh、TeeBlockEditor、TeeBlockGallery、TeeBlockClasses、TeeWater、TeeBlocks、TeeMakerConst、TeeLoadError、TeeTarga、TeeGLSLShaders、TeeViewBlock、TeeCamera、TeeMakerControl、TeePlayMP3、TeeTextureSelector、TeeMakerEditor、TeeSelectProperty、TeeClipBlock、TeePointEditor、T ,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,如何找出该单元属于哪个包?

【问题讨论】:

  • 根据您提供的消息,该软件包依赖于这些单元。如果要删除依赖项,则需要删除引用。也许您在 requires 子句中有一个不需要存在的包?不看源头,很难明确回答

标签: delphi


【解决方案1】:

显然,您的包使用了 TeeChart 包中的很多单元(或几个包?我不太了解 TeeChart)。 不要隐式导入它们,只需将您的显式单元(即您在contains 部分中明确命名的单元)放入requires 部分中需要的

这不仅使您的包裹更纤薄,而且还避免了此类命名冲突。当使用包含同名单元的其他包时,使用您的包的任何人都将面临命名冲突。这就是为什么 IDE 在识别出其他包使用的所有或大部分包都在您的包中时,建议链接到您的包。

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

示例(包MyControls):

contains
  MyUnit;

MyUnit:

unit MyUnit;

uses
  TeeThis, TeeThat, TeeOther;

现在TeeThisTeeThatTeeOther 单元已隐式链接到您的包中。但是如果你的包引用了包含这些TeeXXX单元的其他包(比如TeeChart.bpl),编译器不会将它们添加到你的包中,它会使用从TeeChart 包中间接(引用它们)。这使您的包更小,并允许其他包以相同的方式使用相同的TeeXXX 单位。在 TeeXXX 单位方面,您和其他软件包之间不会有命名冲突。

requires
  TeeChart,
  etcetera;

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

更新

您的更新显示您现在需要 TeeChart 包。如果消息正确,编译器还包括单元TeeBlockCanvasTeeMeshTeeBlockEditorTeeBlockGalleryTeeBlockClasses等。在 your 包中,因此您明确包含的单位(在contains部分中)似乎也使用这些单位。将包含这些单元的包(可能是TeePro923TeeUI923Tee923)也放入requires 部分:

requires
  rtl,
  vcl,
  vclx,
  // etc...
  TeePro923,
  TeeUI923,
  Tee923,
  TeeImage923,
  TeeGL923,
  // etc...

现在您应该不会再收到所有这些单元都隐式包含在您的包中的消息了。

【讨论】:

  • @Paul:不,这正是我写的:你的明确导入单位(例如MyUnitcontains部分中明确提到的那些)使用单元(如TeeThis等)未明确导入,但因为需要它们,所以无论如何都会被一一拉入包中,因此您的包包含MyUnit以及三个隐式导入的(TeeThis 等)。见这里:rvelthuis.blogspot.de/2017/08/…
  • 换句话说:您的包裹包含您编写的所有单位以及消息中提到的所有单位,即大约三十个左右的 TeeChart 单位。那是错的。您的包裹应该只包含您的单位,并且只引用 TeeChartpackage 中的其他单位,方法是将TeeChart 放入requires 部分。您是在告诉包只链接到另一个包中的外部单元,而不是默默地将它们物理地包含到您的包中。
  • 显示您的 contains 和 requires 部分,我会告诉您要更改的内容。
  • 您编写的单位,即contains 部分中的那些单位在其uses 子句中有其他 TeeChart 单位。然后将这些单元放入 your 包中,而它们应该只从 TeeChart 包中引用。查看我的更新。
  • 我首先要理解你的回答。事实是,单位永远不应该同时在两个包装中。正如我所写的,您应该已经引用了包含您使用的单元的包。使用另一个包中的单元的唯一方法是引用该包。其他任何事情都是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2016-03-13
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2020-09-02
相关资源
最近更新 更多