从 lua 5.1 开始,lua 定义了一些关于 module 和 package 的规则,使 module 能够一次创建,到处使用。同时,用 module 和 package 组织代码,使代码组织结构更加清晰,便于管理。
module 和 package 定义
module 的加载过程
lua module 的加载由 lua 函数require(modulename)
引起,如果该函数执行成功,则返回一个代表该 module 的 table*,该 *table 包含 module 提供的各种数据(包括 function 和 table)。查找 module 文件
lua 通过 module 名称和路径模板来查找需要加载的 module 文件。
路径模板由 ; 分割,? 则由 module 名称代替
假设路径模板为:?;?.lua;/usr/local/lua/?/init.lua
,调用require("abc")
后,查找的 module 文件路径包括:abc
abc.lua
/usr/local/lua/abc/init.lua.lua 文件的路径模板
.lua 文件的路径模板由 package.path 变量值提供。lua 运行时负责 package.path 的设置。package.path 有三个来源:
一是操作系统环境变量LUA_PATH_5_3
二是操作系统环境变量LUA_PATH
三是 lua 源码编译时定义的默认路径模板
lua 运行时依次检查三个来源,一旦某来源有效,则停止检查并设置 package.path
lua 源码编译时定义的默认搜索路径(linux lua 5.3)lua 源码编译时定义的默认搜索路径(windows lua 5.3),假设 lua 可执行文件所在目录为 x/usr/local/share/lua/5.3/
/usr/local/lib/lua/5.3/
/usr/share/lua/5.3/
./在每个查找路径下,查找文件为x/
x/lua
x/../share/lua/5.3/
./?.lua
或?/init.lua
,即以 modulename 命名的 .lua 文件,或者以 modulename 命名的文件夹下的 init.lua。
当请求子模块mod.sub
时,会在查找路径的基础上,再在特定的子目录中查找,如mod/sub.lua
mod/sub/init.luac library 文件的路径模板
c library 文件的路径模板由 package.cpath 变量值提供。lua 运行时负责 package.cpath 的设置。package.cpath 有三个来源:
一是操作系统环境变量LUA_CPATH_5_3
二是操作系统环境变量LUA_CPATH
三是 lua 源码编译时定义的默认路径模板
lua 运行时依次检查三个来源,一旦某来源有效,则停止检查并设置 package.cpath
lua 源码编译时定义的默认搜索路径(linux lua 5.3)lua 源码编译时定义的默认搜索路径(windows lua 5.3),假设 lua 可执行文件所在目录为 x/usr/local/lib/lua/5.3/
/usr/lib/lua/5.3/
/usr/lib/i386-linux-gnu/lua/5.3/
./在每个查找路径下,查找动态链接库文件 (linux: .so, windows: .dll)*。x/
x/../lib/lua/5.3/
./
在 *linux 操作系统下, 查找文件为?.so
或?/init.lua
,即以 modulename 命名的 .so 文件。
当请求子模块mod.sub
时,会在查找路径的基础上,再在特定的子目录中查找;同时,也会查找主模块对应的动态链接库文件,如查找 loadall.so 文件mod/sub.so
mod.so/usr/local/lib/lua/5.3/loadall.so
或查找 loadall.dll 文件x/loadall.dll
,其中x
为 lua 可执行文件所在目录