Lua模块的包管理器LuaRocks

2.5k 词

LuaRocks是Lua模块的包管理器。
它允许你创建和安装Lua模块,作为独立包名为rocks。 您可以在Unix和Windows上下载并安装LuaRocks。
LuaRocks是免费软件,使用与Lua相同的许可证。

@[TOC]

官方 :https://luarocks.org/

linux系统下安装

安装包列表:
http://luarocks.github.io/luarocks/releases/

简单安装

1
2
3
4
5
6
7
8
$ wget https://luarocks.org/releases/luarocks-2.4.3.tar.gz
$ tar zxpf luarocks-2.4.3.tar.gz
$ cd luarocks-2.4.3
$ ./configure; sudo make bootstrap
$ sudo luarocks install luasocket
$ lua
Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
> require "socket"

设置prefix会自动将Luarocks以及往后使用Luarocks安装的Lua包,LuaC包都安装到Luarocks安装路径下的相应位置,否则相关的包文件散落在文件系统中,显得杂乱不便于管理。
如果所安装的Lua模板包含bin文件,则会自动安装到此目录下的bin路径,与Luarocks可执行文件同一路径,更便于管理、使用。

openresty 安装 luarocks 示例

1
2
3
4
5
6
7
8
9
tar xzf luarocks-${RESTY_LUAROCKS_VERSION}.tar.gz
cd luarocks-${RESTY_LUAROCKS_VERSION}
./configure
--prefix=/usr/local/openresty/luajit
--with-lua=/usr/local/openresty/luajit
--lua-suffix=jit-2.1.0-beta3
--with-lua-include=/usr/local/openresty/luajit/include/luajit-2.1
make build
make install

在 OpenResty 中使用 LuaRocks

https://openresty.org/cn/using-luarocks.html

安装 LuaRocks

1
2
3
4
5
6
wget http://luarocks.org/releases/luarocks-2.0.4.1.tar.gz
tar -xzvf luarocks-2.0.4.1.tar.gz
cd luarocks-2.0.4.1/
./configure
make
sudo make install

通过 LuaRocks安装 Lua MD5 库

在本示例中, 我们将使用 Lua MD5 library 作为服务器上的一个例子, 所以我们需要通过 LuaRocks 来安装它:

1
sudo luarocks install md5

配置我们的 OpenResty 应用

1
cd /usr/local/openresty/nginx/

编辑 conf/nginx.conf 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
worker_processes  1;   # we could enlarge this setting on a multi-core machine
error_log logs/error.log warn;

events {
worker_connections 1024;
}

http {
lua_package_path 'conf/?.lua;;';

server {
listen 80;
server_name localhost;

location = /luarocks {
content_by_lua '
local foo = require("foo")
foo.say("hello, luarocks!")
';
}
}
}

最后,我们创建下面两个 Lua 模块文件 conf/foo.lua

1
2
3
4
5
6
7
8
9
10
11
-- conf/foo.lua

module("foo", package.seeall)

local bar = require "bar"

ngx.say("bar loaded")

function say (var)
bar.say(var)
end

和 conf/bar.lua 文件

1
2
3
4
5
6
7
8
9
10
11
12
-- conf/bar.lua

module("bar", package.seeall)

local rocks = require "luarocks.loader"
local md5 = require "md5"

ngx.say("rocks and md5 loaded")

function say (a)
ngx.say(md5.sumhexa(a))
end

开启 Nginx 服务

现在我们通过 Nginx 开启我们的应用:

1
2
ulimit -n1024   # increase the maximal fd count limit per process
./sbin/nginx

如果您已经开启了 Nginx 服务,请先关闭后在重新开启:

1
./sbin/nginx -s stop  #(译注:我们也可以使用平滑重启命令完成此操作 ./sbin/nginx -s reload)

测试我们的应用

现在我们通过curl 工具或者任意兼容HTTP协议的浏览器测试我们的应用:

1
curl http://localhost/luarocks

我们在第一次运行的时候得到以下的内容:

1
2
3
rocks and md5 loaded
bar loaded
85e73df5c41378f830c031b81e4453d2

第二次运行的时候得到以下内容:

1
85e73df5c41378f830c031b81e4453d2

之所以会出现这样的输出数据是因为 Lua Nginx Module 默认缓存了已经加载过的Lua模块 并且这些输出数据的代码是在 Lua 加载时运行的因此他们将不会在执行.