lua module 和 package 小结

lua 5.1 开始,lua 定义了一些关于 modulepackage 的规则,使 module 能够一次创建,到处使用。同时,用 modulepackage 组织代码,使代码组织结构更加清晰,便于管理。

  • modulepackage 定义

    • module

      module 是一个文件,它包含了一些代码 code,这些代码能够返回一个 *table
      需要注意两点,一是 *code
      可以是 lua code 或者 c binary code*,二是这些代码能够被 *lua 函数 require(modulename) 加载。
    • package

      package 是按照层级 hierarchical 组织的 module 的总称。lua 用点 . 来区分层级,如 mod.sub 中,submodsub module
  • module 的加载过程

    lua module 的加载由 lua 函数 require(modulename) 引起,如果该函数执行成功,则返回一个代表该 moduletable*,该 *table 包含 module 提供的各种数据(包括 functiontable)。
    • 检查 table: package.loaded

      如果 module 已存在,则直接返回该 module,否则执行下一步。
    • 查找对应的 lua 文件

      如果找到对应 lua 文件,则调用函数 loadfile 获取 loader,否则执行下一步。
    • 查找对应的 c library

      如果找到对应的 c library,则调用函数 package.loadlib 获取 loader,否则返回并提示错误信息。
    • 获取 module

      调用 loader 获得返回值,如果该返回值不为 nil 则保存该返回值至 table: packge.loaded,并返回该值,否则返回 true
  • 查找 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)
      /usr/local/share/lua/5.3/
      /usr/local/lib/lua/5.3/
      /usr/share/lua/5.3/
      ./
      lua 源码编译时定义的默认搜索路径(windows lua 5.3),假设 lua 可执行文件所在目录为 x
      x/
      x/lua
      x/../share/lua/5.3/
      ./
      在每个查找路径下,查找文件为 ?.lua?/init.lua,即以 modulename 命名的 .lua 文件,或者以 modulename 命名的文件夹下的 init.lua
      当请求子模块 mod.sub 时,会在查找路径的基础上,再在特定的子目录中查找,如
      mod/sub.lua
      mod/sub/init.lua
    • c 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)
      /usr/local/lib/lua/5.3/
      /usr/lib/lua/5.3/
      /usr/lib/i386-linux-gnu/lua/5.3/
      ./
      lua 源码编译时定义的默认搜索路径(windows lua 5.3),假设 lua 可执行文件所在目录为 x
      x/
      x/../lib/lua/5.3/
      ./
      在每个查找路径下,查找动态链接库文件 (linux: .so, windows: .dll)*。
      在 *linux
      操作系统下, 查找文件为 ?.so?/init.lua,即以 modulename 命名的 .so 文件。
      当请求子模块 mod.sub 时,会在查找路径的基础上,再在特定的子目录中查找;同时,也会查找主模块对应的动态链接库文件,如
      mod/sub.so
      mod.so
      查找 loadall.so 文件 /usr/local/lib/lua/5.3/loadall.so
      或查找 loadall.dll 文件 x/loadall.dll,其中 xlua 可执行文件所在目录