#Lua 的 Package 模块
变量 | 说明 |
---|---|
package.config | 包的配置字符串 |
package.cpath | require 搜索 C 加载器的路径 |
package.path | require 搜索 Lua 加载器的路径 |
package.loaded | 已经加载的模块列表 |
package.preload | 用于存储特定模块的加载器的表 |
package.searchers | 用于控制 require 如何查找模块的表 |
函数 | 说明 |
---|---|
package.loadlib | 导入 C 库中的函数 |
package.searchpath | 查找名称 |
#package.config
package.config
是编译时决定的包模块配置字符串:
- 第一行是目录分隔符;Windows 系统默认为
"\"
,其它系统默认为"/"
- 第二行是路径模板分隔符;默认为
";"
- 第三行是路径模板替换字符;默认为
"?"
- 第四行是在 Windows 系统上查找模块时替换为可执行文件所在目录的字符;默认为
"!"
- 第五行是
luaopen_
函数名末尾被忽略部分的开始字符;默认为"-"
,例如luaopen_MyLib-2.0
#package.cpath
package.cpath
是 require 函数搜索 C 加载器使用的路径列表。
示例值:
/usr/local/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/loadall.so;./?.so
#package.loaded
package.loaded
是已经加载的模块列表。
示例值:
os table: 0x1d320 package table: 0x1cbc8 io table: 0x1d558 coroutine table: 0x1d130 debug table: 0x1ca10 table table: 0x1d388 utf8 table: 0x1c858 math table: 0x1e878 string table: 0x1e198 _G table: 0x1bb98
#package.path
package.path
是 require 函数搜索 Lua 加载器使用的路径列表。
示例值:
/usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua;/usr/local/lib/lua/5.4/?.lua;/usr/local/lib/lua/5.4/?/init.lua;./?.lua;./?/init.lua
#package.preload
package.preload
是构建时配置的模块加载器列表,默认是空的。
#package.searchers
模块的查找器函数列表,默认为:
- 第一个查找器尝试从
package.preload
中查找加载器package.preload[modname]
- 第二个查找器尝试从
package.path
中查找 Lua 库形式的加载器 - 第三个查找器尝试从
package.cpath
中查找 C 库形式的加载器require("mylibs")
尝试加载mylibs.so
中的luaopen_mylibs
函数
- 第四个查找器尝试使用一体化加载器(多个子模块集成在一个 C 库中):从
package.cpath
中查找 C 库形式的加载器require("mylibs.xx")
尝试加载mylibs.so
中的luaopen_mylibs_xx
函数require("mylibs.yy")
尝试加载mylibs.so
中的luaopen_mylibs_yy
函数require("mylibs.zz")
尝试加载mylibs.so
中的luaopen_mylibs_zz
函数
#package.loadlib
package.loadlib (libname, funcname)
说明
动态链接 C 库 libname
,查找函数 funcname
并将其作为 lua_CFunction
返回。
如果 funcname
是 "*"
,则仅动态链接 C 库 libname
,从而使器导出的符号可以被使用。
typedef int (*lua_CFunction) (lua_State *L);
参数
libname
- 要链接的动态库名称(完整文件名,不可省略扩展名)funcname
- 要加载的函数名(完整符号,不可省略lua_open
前缀)
返回值
- 返回加载的 C 函数
#package.searchpath
package.searchpath (name, path [, sep [, rep]])
说明
在路径 path
中查找名称 name
。
路径 path
是一个字符串,包含一系列以分号(;
,受 package.config
影响)分隔的路径模板,用于生成路径:
- 路径模板中的问号(
?
,受package.config
影响)会被替换为name
name
中的sep
(默认为.
)会被替换为rep
(默认为系统路径分隔符)
然后尝试以读模式打开生成的路径。
例如 path
为 "./?.lua;./?.lc;/usr/local/?/init.lua"
,name
为 module.sub
,将依次尝试打开:
"./module/sub.lua"
"./module/sub.lc"
"/usr/local/module/sub/init.lua"
。
参数
name
- 要查找的名称path
- 查找的路径模板sep
- 名称name
中的分隔符,生成路径时会被替换为rep
;默认为"."
rep
- 生成路径时替换sep
的字符;Windows 系统默认为"\"
,其它系统默认为"/"
返回值
- 成功时返回第一个成功的文件路径
- 失败时返回
nil
和错误消息
#关联文档
- require - 加载模块