自由 Pascal 编译器现在支持动态包
我很高兴地宣布自由 Pascal 编译器和 Lazarus IDE 的首次发布,全面支持动态包。这一功能对生态系统来说是一个长期期待的更新,但现在可以从此网站下载完整的实现。动态包允许用户在几秒钟内创建和安装组件、控件及 Lazarus 扩展,无需重建整个 IDE。它们还可以在您自己的程序中使用,以开发和部署通过动态包库暴露原生 Pascal 类和类型的插件。为了支持此功能,我对编译器、其运行时和 Lazarus IDE 进行了多次改进。我还创建了额外的 IDE 扩展,以改善使用 Lazarus 包的体验。动态包作为 Linux、Windows 和 macOS 的标准共享库文件实现。它们包含由编译器生成的附加元数据,可以使用新的 RTL 单元进行检查和查询。运行时还包括安全保留线程变量和在程序及包之间或多个包之间管理动态类型(如字符串和动态数组)的机制。视频:动态包示例部署程序时,您仍然可以将所有内容打包成单个可执行文件。或者,您可以将其拆分成多个动态包,可以在程序运行时替换,从而提供插件系统。限制动态包有一些限制。首先,包中包含的单元不能与包本身同名。我增强了默认包系统,以便生成的 Pascal 源文件自动在包名后附加单词 Package。例如,如果您创建一个名为 ElectroTools.lpk 的包,则列出该包中所有单元的源文件将命名为 ElectroToolsPackage.pas,而不是 ElectroTools.pas。另一个限制是,单元名必须在所有包中唯一。如果其他人编写了一个名为 Widgets 的单元,您不能安装另一个包含同名单元的包。您必须选择安装哪个包,或者重命名其中一个冲突的单元。由于动态包包含其中所有内容的映射,因此它们也比普通共享库大。去除动态包的剥离操作会移除其作为动态包所需的元数据。RTL 增强type TPackageType = record { 声明该类型的单元 } UnitName: string; { 类型的名称 } Name: string; { 类型的种类 } Kind: TTypeKind; { 类型的 RTTI } Info: PTypeInfo; { 如果 Kind 为 tkClass,则为类,否则为 nil } ClassType: TClass; end; 运行时库已增强以支持动态包,包括检查其内容所需的元数据和在包边界之间安全管理动态类型和线程变量所需的机制。新的单元 DynPkgTypes.pas 已添加到 RTL,以帮助您从动态包中读取信息。可以从包中获取经过验证的 RTTI 信息以处理其内容。RTL 内提供足够的函数来处理动态包,完成您需要的一切,包括在运行时加载、枚举、搜索和卸载包。Lazarus 增强我对 Lazarus IDE 进行了几次增强,以更好地利用动态包。您打开 Lazarus 时首先注意到的新进度窗口可以在 IDE 外部出现。当您修改属于与 IDE 注册的包的源代码时,系统会检测到更改,并在 Lazarus 启动之前自动重建该包。在此过程中,进度窗口会通知您检测到更改,正在重建包。当您选择重建整个 IDE 时,也会出现相同的窗口。它保持可见,并显示当前操作的信息,包括 IDE 重新启动前的预计剩余时间。当添加或移除包时,如果操作超过五秒,进度窗口也会出现。这种情况可能发生在一次安装多个包时,这也是另一个新特性。另一个增强是新的包窗口,默认停靠在右侧。它显示您最近打开的包,列表在 Lazarus 会话之间持续存在。您可以浏览包中的文件,双击项目以打开它。当您打开已安装的包并在其包窗口中点击编译时,任何相关的控件、组件或扩展将在一到两秒内更新。这大大加快了开发速度,因为之前需要重建整个 IDE 的更改现在几乎可以立即应用。列出可用包的包菜单也得到了改进。添加或移除包现在可以在不需要重建的情况下更新 IDE。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡