4547

23 分钟

#Lua 的 Package 模块

变量说明
package.config包的配置字符串
package.cpathrequire 搜索 C 加载器的路径
package.pathrequire 搜索 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.cpathrequire 函数搜索 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.pathrequire 函数搜索 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

模块的查找器函数列表,默认为:

  1. 第一个查找器尝试从 package.preload 中查找加载器 package.preload[modname]
  2. 第二个查找器尝试从 package.path 中查找 Lua 库形式的加载器
  3. 第三个查找器尝试从 package.cpath 中查找 C 库形式的加载器
    • require("mylibs") 尝试加载 mylibs.so 中的 luaopen_mylibs 函数
  4. 第四个查找器尝试使用一体化加载器(多个子模块集成在一个 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"namemodule.sub,将依次尝试打开:

  • "./module/sub.lua"
  • "./module/sub.lc"
  • "/usr/local/module/sub/init.lua"

参数

  • name - 要查找的名称
  • path - 查找的路径模板
  • sep - 名称 name 中的分隔符,生成路径时会被替换为 rep;默认为 "."
  • rep - 生成路径时替换 sep 的字符;Windows 系统默认为 "\",其它系统默认为 "/"

返回值

  • 成功时返回第一个成功的文件路径
  • 失败时返回 nil 和错误消息

#关联文档

#推荐阅读

创建于 2025/10/21

更新于 2025/10/21