lua的包管理工具是:LuaRocks。本文内容基于MacOS系统。
参考官方文档:Using LuaRocks
可用的模块在luarocks官网搜索即可。例如现在我们安装一个模块。
注意:不知道是故意为之,还是因为有。在的安装目录(以及任意子目录)执行命令,和在其它目录下执行命令时,产生的行为并不一致。例如:
-
在安装目录下执行,模块会被安装到;而在其它目录执行此命令,模块会被安装到。具体的子路径则都符合rock的树结构。
-
执行命令,可以得到适用于lua的模块搜索路径规则(稍后会讲到)。然而只有在的安装目录中执行此命令,得到的规则中才会包含匹配路径的项。
-
就像这两种目录对应了两个不同的环境一样。我提了一个issue询问此现象。
如果你并不是在安装目录下执行的模块安装命令,那么现在就可以直接在lua代码中使用成功使用此模块了。
注意,通常模块安装命令中使用的模块名就是在lua代码中用加载时填写的模块名,但也有一些例外的模块。比如在加载时的模块名是,即要使用,而不是。
2.1 分析
为什么直接就可以使用,这么简单?作为一个经常遭到"挑战"的程序员,你可能原本已经做好了"和大战三百回合,不破终不还!"的准备,结果没想到刀还没拔出来,敌人就吓跑了。如果你一时接受不了这么简单的战斗,那么可以继续阅读,识破的诡计~
(非战斗人员请迅速撤离!)
注意:继续阅读需要对Lua的模块加载知识有一定的基础了解,如果有需要的话,可以在评论区留言,我会抽时间整理一篇关于Lua模块加载的文章,你也点击CSDN文末的推广码,我很乐意分享这些知识。
其实这是因为将模块安装在了,具体见luarocks树结构。而这个树结构恰好匹配了和的默认规则。
但是,如果你是在安装目录下执行的模块安装命令,就会像一开始说的那样,模块会被安装在,这并不在或的默认规则中。
因此,需要手动配置或,或者或环境变量。按照惯例,前两个环境变量专门用来配置模块,后两个专门用来配置C模块()。
注意,以下对环境变量的设置命令,只在当前shell会话有效,然后你可以通过执行命令开启命令行交互模式使用lua,运行验证是否成功。如果想要永久设置环境变量,应该把它们写到shell的启动文件中,可以写到,可以写到。
如果对shell的这些基础知识感兴趣,可以阅读我的另一篇博客(篇幅较长):【Linux基础】理解并善用Shell – Shell精讲
于是我们可以配置:
但此时你若是尝试使用,会发现依然报错。仔细观察报错信息可以发现:其实已经找到了,报错的原因是,中还了其它的模块。结合luarocks树结构观察模块的安装目录,以及中的,会发现其实是没有被加载到。所以还需要配置:
然后再尝试,就可以啦。
2.2
其实,luarocks提供了一种更简单的方式来配置环境变量。
luarocks提供了一种半自动化的方式:命令。此命令能够打印出适合当前平台的、用于设置环境变量的命令。
并且,此命令得到的模块搜索路径规则中,会包含默认规则;另外还有一个,也会拼接原有的。因此不必担心自己的环境会被覆盖。
然后通过****命令,就可以一键设置环境变量。注意,此命令只在当前shell会话有效,如果想要永久有效,需要把此命令写到shell启动文件中。
但正如一开始所说,命令在不同目录下产生的行为并不一致。只有在安装目录(及其任意子目录)下执行,得到的规则中才会包含匹配路径的项。而现在我们之所以需要配置环境变量,就是因为luarocks安装的模块不在默认目录下,而是在目录下。
所以,我们必须在shell启动文件中使用这种方式配置环境变量:
然后尝试,Bingo!
至此,战斗结束,你就可以对宣布:KO!🎉🎉🎉
查看模块信息描述:查看已安装模块的信息描述。
移除模块
luarocks存在两点问题:
- 一些模块安装时的名字和应该使用的名字不一致。如 ->
- luarocks没有提供模块的多版本管理功能。(我没有找到有关的描述)
这在协同开发、长期开发时,会有些困难。
- 我是否需要在项目中添加一个文件来介绍项目使用了哪些模块?
- 由于没有版本管理,可能团队中的每个人在不同时间安装到的是不同版本的模块,因此,我是否应该把模块放到项目目录下?