由于想了解一下 OpenResty, 先看看 Lua 的语法。
这是第四篇,Lua 包的概念以及包管理工具 luarocks。
Lua 包机制
看起来和 nodejs 有点异曲同工。
- 模块定义:在文件中
return
一个数组,里面可以有变量、函数 - 模块导入:
require("<模块名>")
,或者require "<模块名>"
,可以用变量接收这个模块。
加载机制
- 检查
package.loaded
(table
类型)- 将其中模块名称为 key 对应的 value 设置为
nil
,再次 require 模块时,可以重新加载模块 - 如果没有加载就该
package.searchers
登场,依次用后续几种方式处理
- 将其中模块名称为 key 对应的 value 设置为
package.preload[modname]
- 环境变量
LUA_PATH
=>package.path
=>package.loadfile
- 环境变量,示例:
~/Resources/Lua/modules/?.lua;;
,分号隔开,后面的空字符串就表示原来的路径。
- 环境变量,示例:
- C 库加载:环境变量
LUA_CPATH
=>package.cpath
=>package.loadlib
- 手动加载:
1. 如果是子模块的方式(local path = "/usr/local/lua/lib/libluasocket.so" local f = assert(loadlib(path, "luaopen_socket"))
require(a.b.c)
)
会从最高级别,逐级查找luaopen_a_b_c
这样的方法,将返回结果当作模块加载。
- 手动加载:
- 还没有找到就抛出异常。
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/