首页 > 代码库 > Lua的require机制
Lua的require机制
在Lua中,有模块这个定义,加载一个模块需要使用require函数,require是一个全局函数。
require有两个写法require("modname")和require "modname"
1.首先require函数会查找package.loaded表,检测modname是否加载过,如果加载过,则不再加载,如果没加载过,则继续
2.require加载模块的按照package.searchers序列的指引来查找加载器,使用另一个全局函数loader()实现,PS:package.searchers序列可以需改
3.默认的package.searchers序列如下:
- 查询package.preload[modname],如果有这个值,完工。通常返回为空
- 查询package.path路径,如果有这个模块,完工
- 查询package.cpath,如果有这个模块,完工
如果在加载或运行模块时有错误, 或是无法为模块找到加载器, require
都会抛出错误。
package.config
一个描述有一些为包管理准备的编译期配置信息的串。 这个字符串由一系列行构成:
- 第一行是目录分割串。 对于 Windows 默认是 ‘
\
‘ ,对于其它系统是 ‘/
‘ 。 - 第二行是用于路径中的分割符。默认值是 ‘
;
‘ 。 - 第三行是用于标记模板替换点的字符串。 默认是 ‘
?
‘ 。 - 第四行是在 Windows 中将被替换成执行程序所在目录的路径的字符串。 默认是 ‘
!
‘ 。 - 第五行是一个记号,该记号之后的所有文本将在构建
luaopen_
函数名时被忽略掉。 默认是 ‘-
‘。
package.cpath
这个路径被 require
在 C 加载器中做搜索时用到。
Lua 用和初始化 Lua 路径 package.path
相同的方式初始化 C 路径 package.cpath
。 它会使用环境变量 LUA_CPATH_5_3
或 环境变量 LUA_CPATH
初始化。 要么就采用 luaconf.h
中定义的默认路径。
package.loaded
用于 require
控制哪些模块已经被加载的表。 当你请求一个 modname
模块,且 package.loaded[modname]
不为假时, require
简单返回储存在内的值。
这个变量仅仅是对真正那张表的引用; 改变这个值并不会改变 require
使用的表。
package.loadlib (libname, funcname)
让宿主程序动态链接 C 库 libname
。
当 funcname
为 "*
", 它仅仅连接该库,让库中的符号都导出给其它动态链接库使用。 否则,它查找库中的函数 funcname
,以 C 函数的形式返回这个函数。 因此,funcname
必须遵循原型lua_CFunction
。
这是一个低阶函数。 它完全绕过了包模块系统。 和 require
不同, 它不会做任何路径查询,也不会自动加扩展名。 libname
必须是一个 C 库需要的完整的文件名,如果有必要,需要提供路径和扩展名。funcname
必须是 C 库需要的准确名字 (这取决于使用的 C 编译器和链接器)。
这个函数在标准 C 中不支持。 因此,它只在部分平台有效 ( Windows ,Linux ,Mac OS X, Solaris, BSD, 加上支持 dlfcn
标准的 Unix 系统)。
package.path
这个路径被 require
在 Lua 加载器中做搜索时用到。
在启动时,Lua 用环境变量 LUA_PATH_5_3
或环境变量LUA_PATH
来初始化这个变量。 或采用 luaconf.h
中的默认路径。 环境变量中出现的所有 ";;
" 都会被替换成默认路径。
package.preload
保存有一些特殊模块的加载器
这个变量仅仅是对真正那张表的引用; 改变这个值并不会改变 require
使用的表。
Lua的require机制