lua自身的模块是比较少的,我们如果想扩展lua的功能,而又不想重复造轮子的时候,就需要去安装第三方模块。
首先需要安装luarocks,它是lua的包管理器。(当然我已经装好了luajit,没装lua或luajit的情况下可以看看这个:https://github.com/torch/luajit-rocks )
项目地址:https://github.com/keplerproject/luarocks
首先下载最新版luarocks:
wget http://keplerproject.github.io/luarocks/releases/luarocks-2.2.1.tar.gz
tar -zxvf luarocks-2.2.1.tar.gz
cd luarocks-2.2.1/
安装:
./configure --prefix=/usr/local/luarocks --with-lua=/root/luajit-2.0 --lua-suffix=jit --with-lua-include=/root/luajit-2.0/include/luajit-2.0 --with-lua-lib=/root/luajit-2.0/lib
make build && make install
这里说明一下 :
--prefix 指定luarocks的安装位置,默认为/usr/local
--with-lua 指定lua的安装目录。这里说明一下文档里可能没说清的问题,因为我装的是luajit,所以指定的不是lua的安装目录,而是luajit的安装目录。我这里是/root/luajit-2.0。
--lua-suffix 后缀,因为我装的是luajit,所以这里输入jit
--with-lua-include lua(luajit)的头文件所在目录
--with-lua-lib lua(luajit)的链接库所在目录
--with-lua、--with-lua-include、--with-lua-lib这几个路径在我安装luajit的时候就已经记下来了,如果我不知道他们具体位置的话,我会去看看默认的对不对,不对再在服务器上找找。
另外,不能够用make && make install来编译,而需要用make build && make install,具体为何可以参见:https://github.com/keplerproject/luarocks/issues/267
很快我这就编译好了,luarocks可执行文件在这里:/usr/local/luarocks/bin,将它加入我的环境变量PATH:
vim ~/.bashrc
export PATH=$PATH:/usr/local/luarocks/bin
source ~/.bashrc
OK,运行一下luarocks --version:
可见没有出错。
好,我们需要装lua-http-parser,就需要先用luarocks去装lua-http-parser。
首先试了试luarocks install lua-http-parser,是存在这个库的,但安装的过程中出错了:Could NOT find Lua51 (missing: LUA_LIBRARIES LUA_INCLUDE_DIR)
缺少和两个的定义。
这里也足以见得luarocks这个包管理器并不是那么完善。我试过用luarocks install luasocket是可以成功安装的。有的包可以直接装,有的包不能直接装,和pip等成熟的包管理器还是有一定差距的。
既然不能一键安装,我们就手工装吧。
先来到lua-http-parser的项目中:https://github.com/brimworks/lua-http-parser
git clone https://github.com/brimworks/lua-http-parser.git
cd lua-http-parser
git clone git://github.com/joyent/http-parser.git
lua-http-parser是依赖于http-parser的,所以在lua-http-parser目录下,需要把http-parser也给clone下来。
这个时候编译的话,还是会出现上面同样的错误,但我们这时候就可以编辑CMakeLists.txt,来手工修改。
编辑CMakeLists.txt,在引用LUA_LIBRARIES、LUA_INCLUDE_DIR之前,将他们先手工写出来:
set(LUA_LIBRARIES "/root/luajit-2.0/lib")
set(LUA_INCLUDE_DIR "/root/luajit-2.0/include/luajit-2.0")
这是根据我自己VPS上luajit的目录定义的。出来执行luarocks make CFLAGS=-g lua-http-parser-1.0-1.rockspec,即可成功安装:
将test.lua里的#!/usr/bin/env lua改成#!/root/luajit-2.0/bin/luajit,chmod u+x test.lua执行之。
不过实际发现,安装好了执行的时候还是提示找不到“http.parser”。
因为我虽然安装了luarocks,但我却并没有将luarocks和我机子上原有的luajit联系上。我必须将luarocks的library目录加入luajit引用的环境变量才可以。
luarocks已经替我想到了这一点,执行
luarocks path --bin
就可以列出我们需要设置的全局变量:
依次执行这三个export后,就设置好了LUA_PATH、LUA_CPATH、PATH。
再次执行test.lua后,已经OK了。
通过安装lua-http-parser模块作为一个例子,再安装其他模块也大同小异了。
说一下我这段时间折腾linux的一些感想。
自从将个人PC换成MAC以后,平时的用户习惯就彻底变了。大部分的操作都会通过命令行去进行,安装各种各样的软件也让我见识了linux的方便所在。
以前非常憎恨的编译与安装,现在变成生活里不可或缺的一部分。
现在我细细想想,linux下每个软件都有详细的文档,从安装到使用都有一个“老师”在不停指导你,大部分的软件都可以直接浏览源码,通过简单的配置文件的方式更改设置,邮件列表、github issues、stackoverflow、google上总有人和你遇到过同样的问题……你会发现这是一些多么值得庆幸的事情。
当我明白了linux下常见的一些配置文件的时候,才发现windows的注册表是有多么臃肿与麻烦。
当我用几个数字就把虚拟主机、多用户环境权限控制做好的时候,才发现linux下配置系统安全是多么简单。
当我操作ssh就像在操作自己的MAC一样快的时候,才发现能用终端控制远程主机有多方便。
所以少年,学会linux的基本使用,不再是一个“专业知识”,而应该是一个“大众技能”。就像驾照一样,你能一辈子不拿吗?