创建和使用库

介绍

Gambas库允许在项目之间共享代码。对于编写较大的项目,或者甚至是几个具有相同功能或对象的项目是非常有用的。

库是可以在另一个项目中使用的Gambas可执行文件,而不是Gambas语言的扩展组件。


引言

  • 总是应该为自己需要共享的代码创建库而不是组件,并且应能与项目一起发布。

  • 组件 就像Gambas语言的扩展,应能与Gambas源代码一起发布。


库搜索路径

执行依赖于库的项目时,将按如下顺序在以下路径中搜索库的可执行文件:
顺序 路径 备注
1. <项目可执行文件所在目录>/<名称>.gambas 向后兼容。
2. $XDG_DATA_HOME/gambas3/lib/<厂商>/<名称>:<版本号>.gambas 如果定义了环境变量$XDG_DATA_HOME
3. ~/.local/share/gambas3/lib/<厂商>/<名称>:<版本号>.gambas 如果没有定义环境变量 $XDG_DATA_HOME
4. <项目附加存档目录>/<厂商>/<名称>:<版本号>.gambas 项目附加存档目录是在“项目”->“属性”对话框的“库”选项卡中定义的项目属性。
5. /usr/lib[/multiarch]/gambas3/<厂商>/<名称>:<版本号>.gambas 默认情况下,由Gambas IDE 打包程序创建的二进制库软件包默认安装在这里,并且在全系统范围内可以使用(这对于多用户的计算机很重要)。在基于Debian的实现级别中, multiarch (多重架构)依赖于发行版, 请参见 Debian Multiarch
目前(截至2017年6月19日),Gambas自动工具打包程序并未包含支持该规则。库的安装是根据本地发行版对automake实用程序的设置。
使用/usr/lib(使用特定子目录的情况除外)安装非发行版软件违反了LSB文件系统层次结构(FSH)标准。特别是,从发行版重新安装或升级系统可能甚至必然 覆盖/usr/lib目录。FSH(3.0版)第4.9节专门讨论了本地安装软件的问题,并建议使用传统的 usr/local 目录。
6. /usr/bin/<厂商>/<名称>.gambas 因为用Gambas编写的标准程序可以被作为库使用。
如上所述,使用/usr/bin路径(使用特定子目录的情况除外)违反了FSH标准。本地安装的软件可能会被系统升级覆盖或删除。

第一个和最后一个主要是为了向后兼容。

第二个和第三个位置是 当前用户 安装库的位置。当从库的源项目生成可执行文件或者从Gambas农场服务器安装库时,这些库都会被自动安装在“单用户范围”的基础上。
这种“单用户范围”的基础实际上使用非常方便,因为它允许开发人员和/或测试人员使用最新的版本,即“不稳定”的版本,而不会对系统范围的“稳定”版本造成干扰。
Top

如何从项目中创建库?

创建一个正常的Gambas项目。在“项目属性”对话框中,选择“库”作为项目类型。填写厂商名称(重要!)。

只有标有 EXPORT 关键字的类才会被导出,并且对使用该库的项目可见。

然后生成项目可执行文件。可执行文件将被安装在(3)中。

Top

如何在项目中使用库?

打开另一个项目。打开项目的属性对话框并转到“库”选项卡。可以在这里添加所有已安装的库。如果使用的库依赖于另一个库,则必须定义正确的顺序,这些库将从顶部(第一个)加载到底部(最后一个)。

[这需要更多的解释]

Top

如何在这台计算机或另一台计算机上安装全系统的库?

从库中创建安装包(Ctrl-Alt-I)。在目标计算机上安装此程序包。如果在其他计算机上安装此软件包,则库将被安装在(5)中。

注意,搜索顺序总是优先选择用户主目录中的版本,而不是系统主目录中的版本。因此,当完成测试时,请确保删除本地副本,即单用户范围的副本。
Top

如何测试库

可以在库的内部实现测试。请记住,只有标记为EXPORT的类对使用库的项目可见(公开)。因此,在库项目本身中,可以包含未公开的类或模块来测试库的特性。

Top

更深入的话题

使用相对路径访问文件

有时可能希望使用 相对路径 访问文件。但文件在哪个可执行文件中呢?库可执行文件或是使用库的项目可执行文件。要访问库可执行文件本身里的文件,只需使用./开头启动相对路径。如果需要访问位于主项目里的文件,则必须以../开头开始相对路径。

库依赖

[待写]

“初始化”库

有时,当主项目执行时,可能需要库在加载时执行一些自动“启动”处理。也就是说,即使在主项目尝试使用它的“公开特性”之前,库也需要做一些事情。

实现的方法是公开一个可调用的例程(比如在被导出模块中的“启动”方法),这样主程序就可以在使用任何有用的功能之前调用该方法。一旦这样多做几次,会发现这是痛苦的...,必须确保主项目中某一处的调用能是对库的第一次访问,而且后续可能不得不在库内部跟踪启动是否已被完成,等等。而且你可能需要在库内部跟踪启动是否完成等。

更好的方法。独立于主项目执行逻辑且自动进行。[More to come...]

发行库

发行软件和相关库给其他系统上的用户,请 特别注意 上面关于违背FSH标准的警告。
Top

参见