lua 5.1 的 module

本文深入解析Lua 5.1版本中引入的官方模块实现标准,介绍了如何通过module指令创建模块,并讨论了如何保持对全局环境的访问,包括使用local变量和package.seeall选项的方法。

  本文转自http://blog.codingnow.com/2006/02/lua_51_module.html。

lua 从 5.1 开始终于官方提供统一的 module 实现标准了,这是个值得庆幸的事。今天读了下相关的源码和文档,把这套机制搞清楚了,还是很巧妙的。从简洁这个角度看,要比 python 强 :)

有一点容易被忽略掉(我的同事在用的时候就忽略掉了),module 指令运行完后,整个环境被压栈,所以前面全局的东西再看不见了。比如定义了一个 test 模块,使用

module("test")

后,下面不再看的见前面的全局环境。如果在这个模块里想调用 print 输出调试信息怎么办呢?一个简单的方法是

local print=print
module("test")

这样 print 是一个 local 变量,下面也是可见的。或者可以用

local _G=_G
module("test")

那么 _G.print 也是可以用的。

当然还有一种巧妙的方式,lua 5.1 提供了一个 package.seeall 可以作为 module 的option 传入

module("test",package.seeall)

这样就 OK 了。至于它们是如何工作的,还是自己读源码会理解的清楚一些。

在读源码时可以发现很多 lua 的技巧,还有一些 undocumented 的东西,比如 newproxy :) 它是一个 unsupported 且 undocumented 的东西,但是它希望实现的却是个巧妙的玩意。

### 如何指定Lua位置或安装捆绑的Lua 5.1副本 在安装Nginx+Lua模块时,如果遇到`error: ngx_http_lua_module requires the Lua library`错误,通常是因为系统无法找到Lua库的位置。以下是解决方法: #### 指定Lua位置 可以通过设置环境变量`LUAJIT_LIB`和`LUAJIT_INC`来指定LuaJIT库和头文件的位置[^1]。例如: ```bash export LUAJIT_LIB=/opt/modules/luajit/lib export LUAJIT_INC=/opt/modules/luajit/include/luajit-2.0 ``` 然后重新运行`./configure`命令。 #### 安装Lua开发包 如果仍然报错,可能是因为缺少Lua开发包。可以通过以下命令安装Lua开发包: ```bash yum install -y lua-devel ``` 这将确保系统中存在Lua库及其头文件[^1]。 #### 使用捆绑的Lua 5.1副本 如果不想依赖系统中的Lua版本,可以选择使用OpenResty提供的捆绑Lua 5.1副本。在编译Nginx+Lua模块时,可以添加`--with-lua51`选项来启用捆绑的Lua 5.1版本。例如: ```bash ./configure --with-lua51 --add-module=/path/to/ngx_http_lua_module ``` #### 示例:完整配置流程 以下是一个完整的配置流程示例: ```bash # 设置LuaJIT路径 export LUAJIT_LIB=/opt/modules/luajit/lib export LUAJIT_INC=/opt/modules/luajit/include/luajit-2.0 # 安装lua-devel yum install -y lua-devel # 配置Nginx+Lua模块 ./configure --with-lua51 --add-module=/path/to/ngx_http_lua_module ``` #### 安装第三方Lua模块 如果需要安装其他Lua模块(如`lua-resty-mlcache`),可以使用OpenResty的`opm`工具。例如: ```bash # 进入容器并安装lua-resty-mlcache docker exec -it open-cache5 bash cd /usr/local/openresty/bin opm install thibaultcha/lua-resty-mlcache ``` 这将安装`lua-resty-mlcache`到指定目录[^2]。 ### 注意事项 - 确保LuaJIT的路径正确,并且包含`lib`和`include`目录。 - 如果使用捆绑的Lua 5.1副本,请确保编译时添加了`--with-lua51`选项。 - 在Docker容器中安装Lua模块时,需确保容器内已安装`opm`工具[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值