TOC

Lua (4): 包

由于想了解一下 OpenResty, 先看看 Lua 的语法。

这是第四篇,Lua 包的概念以及包管理工具 luarocks。

Lua 包机制

看起来和 nodejs 有点异曲同工。

  • 模块定义:在文件中 return 一个数组,里面可以有变量、函数
  • 模块导入:require("<模块名>"),或者 require "<模块名>",可以用变量接收这个模块。

加载机制

  1. 检查 package.loadedtable 类型)
    • 将其中模块名称为 key 对应的 value 设置为 nil,再次 require 模块时,可以重新加载模块
    • 如果没有加载就该 package.searchers 登场,依次用后续几种方式处理
  2. package.preload[modname]
  3. 环境变量 LUA_PATH => package.path => package.loadfile
    • 环境变量,示例:~/Resources/Lua/modules/?.lua;;,分号隔开,后面的空字符串就表示原来的路径。
  4. C 库加载:环境变量 LUA_CPATH => package.cpath => package.loadlib
    • 手动加载:
      lua local path = "/usr/local/lua/lib/libluasocket.so" local f = assert(loadlib(path, "luaopen_socket"))
  5. 如果是子模块的方式(require(a.b.c)
    会从最高级别,逐级查找 luaopen_a_b_c 这样的方法,将返回结果当作模块加载。
  6. 还没有找到就抛出异常。

LuaRocks

sudo apt install -y luarocks

不知道为啥,我执行安装时总是失败,切到 root 账户下就可以成功。

luarocks install luasocket
# Error: Your user does not have write permissions in /usr/local/lib/luarocks/rocks 
# -- you may want to run as a privileged user or use your local tree with --local.

sudo luarocks install luasocket
# Warning: Failed searching manifest: Failed fetching manifest for https://raw.githubusercontent.com/torch/rocks/master - Failed downloading https://raw.githubusercontent.com/torch/rocks/master/manifest - /root/.cache/luarocks/https___raw.githubusercontent.com_torch_rocks_master/manifest
# Warning: Failed searching manifest: Failed fetching manifest for https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master - Failed downloading https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/manifest - /root/.cache/luarocks/https___raw.githubusercontent.com_rocks-moonscript-org_moonrocks-mirror_master/manifest
#
#Error: No results matching query were found.

尝试用代理、--server,啥都不管用,root 就行。

luarocks install luasocket
apt install -y libsqlite0-dev
luarocks install luasql-sqlite
luarocks install luasql-mysql MYSQL_INCDIR=/usr/include/mysql/

参考资料与拓展阅读