【Lua】Lua包管理器-LuaRocks的使用教程

文章目录

  • 安装`luarocks`
  • 使用`luarocks`
    • 1. 安装模块
    • 2. 加载模块
    • 其它命令
    • 协作开发使用方式


lua的包管理工具是:LuaRocks。本文内容基于MacOS系统。

安装luarocks

> cd 你预期的安装目录
> wget https://luarocks.org/releases/luarocks-3.9.2.tar.gz
> tar zxpf luarocks-3.9.2.tar.gz
> cd luarocks-3.9.2
> ./configure && make && sudo make install

使用luarocks

参考官方文档:Using LuaRocks

1. 安装模块

可用的模块在luarocks官网搜索即可。例如现在我们安装一个luasocket模块。

sudo luarocks install luasocket # 安装luasocket模块

注意:不知道是luarocks故意为之,还是因为有bug。在luarocks的安装目录(以及任意子目录)执行luarocks命令,和在其它目录下执行luarocks命令时,产生的行为并不一致。例如:

  • luarocks安装目录下执行luarocks install ...,模块会被安装到luarocks安装目录/lua_modules/;而在其它目录执行此命令,模块会被安装到/usr/local/。具体的子路径则都符合rock的树结构。

  • 执行luarocks path命令,可以得到适用于lua的模块搜索路径规则(稍后会讲到)。然而只有在luarocks的安装目录中执行此命令,得到的规则中才会包含匹配luarocks安装目录/lua_modules/路径的项。

  • 就像这两种目录对应了两个不同的环境一样。我提了一个issue询问此现象。

2. 加载模块

如果你并不是在luarocks安装目录下执行的模块安装命令,那么现在就可以直接在lua代码中使用require("socket")成功使用此模块了。

注意,通常模块安装命令中使用的模块名就是在lua代码中用require加载时填写的模块名,但也有一些例外的模块。比如luasocket在加载时的模块名是socket,即要使用require("socket"),而不是require("luasocket")

2.1 分析

为什么直接就可以使用,这么简单?作为一个经常遭到"挑战"的程序员,你可能原本已经做好了"和luarocks大战三百回合,不破luarocks终不还!"的准备,结果没想到刀还没拔出来,敌人就吓跑了。如果你一时接受不了这么简单的战斗,那么可以继续阅读,识破luarocks的诡计~
(非战斗人员请迅速撤离!)

注意:继续阅读需要对Lua的模块加载知识有一定的基础了解,如果有需要的话,可以在评论区留言,我会抽时间整理一篇关于Lua模块加载的文章,你也点击CSDN文末的推广码,我很乐意分享这些知识。

其实这是因为luarocks将模块安装在了/usr/local/share/lua/5.4/,具体见luarocks树结构。而这个树结构恰好匹配了package.pathpackage.cpath的默认规则。

print(package.path) -- `package.path`规则专门用于查找lua模块
-- /usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua;/usr/local/lib/lua/5.4/?.lua;/usr/local/lib/lua/5.4/?/init.lua;./?.lua;./?/init.luaprint(package.cpath) -- `package.cpath`规则专门用来查找C模块
-- /usr/local/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/loadall.so;./?.so

但是,如果你是在luarocks安装目录下执行的模块安装命令,就会像一开始说的那样,模块会被安装在luarocks安装目录/lua_modules/share/lua/5.4/,这并不在package.pathpackage.cpath的默认规则中。

因此,需要手动配置LUA_PATH_5_4LUA_PATH,或者LUA_CPATH_5_4LUA_CPATH环境变量。按照惯例,前两个环境变量专门用来配置.lua模块,后两个专门用来配置C模块(.so)。

注意,以下对环境变量的设置命令,只在当前shell会话有效,然后你可以通过执行lua命令开启命令行交互模式使用lua,运行require("socket")验证是否成功。如果想要永久设置环境变量,应该把它们写到shell的启动文件中,bash可以写到~/.bashrczsh可以写到~/.zshrc
如果对shell的这些基础知识感兴趣,可以阅读我的另一篇博客(篇幅较长):【Linux基础】理解并善用Shell – Shell精讲

于是我们可以配置LUA_PATH

# ;;会被替换为默认路径,作用是保留默认路径,这很有必要。
export LUA_PATH=";;/Users/wushu/Develop/luarocks-3.9.2/lua_modules/share/lua/5.4/?.lua

但此时你若是尝试使用require("socket"),会发现依然报错。仔细观察报错信息可以发现:其实socket.lua已经找到了,报错的原因是,socket.lua中还require了其它的模块。结合luarocks树结构观察模块的安装目录,以及socket.lua中的require,会发现其实是core.so没有被加载到。所以还需要配置LUA_CPATH

export LUA_CPATH=";;/Users/wushu/Develop/luarocks-3.9.2/lua_modules/lib/lua/5.4/?.so"

然后再尝试require("socket"),就可以啦。

2.2 luarocks path

其实,luarocks提供了一种更简单的方式来配置环境变量。

luarocks提供了一种半自动化的方式:luarocks path命令。此命令能够打印出适合当前平台的、用于设置环境变量的命令。
并且,此命令得到的模块搜索路径规则中,会包含默认规则;另外还有一个PATH,也会拼接原有的PATH。因此不必担心自己的环境会被覆盖。

~/Develop/luarocks-3.9.2 » luarocks path
export LUA_PATH='/Users/wushu/Develop/luarocks-3.9.2/./lua_modules/share/lua/5.4/?.lua;/Users/wushu/Develop/luarocks-3.9.2/./lua_modules/share/lua/5.4/?/init.lua;/usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua;/usr/local/lib/lua/5.4/?.lua;/usr/local/lib/lua/5.4/?/init.lua;./?.lua;./?/init.lua;/Users/wushu/Develop/luarocks-3.9.2/lua_modules/share/lua/5.4/?.lua;/Users/wushu/.luarocks/share/lua/5.4/?.lua;/Users/wushu/.luarocks/share/lua/5.4/?/init.lua'
export LUA_CPATH='/Users/wushu/Develop/luarocks-3.9.2/./lua_modules/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/loadall.so;./?.so;/Users/wushu/Develop/luarocks-3.9.2/lua_modules/lib/lua/5.4/?.so;/Users/wushu/.luarocks/lib/lua/5.4/?.so'
export PATH='/Users/wushu/.luarocks/bin:(原PATH环境变量)'

然后通过**eval "$(luarocks path)"**命令,就可以一键设置环境变量。注意,此命令只在当前shell会话有效,如果想要永久有效,需要把此命令写到shell启动文件中。

但正如一开始所说,luarocks path命令在不同目录下产生的行为并不一致。只有在luarocks安装目录(及其任意子目录)下执行,得到的规则中才会包含匹配luarocks安装目录/lua_modules/路径的项。而现在我们之所以需要配置环境变量,就是因为luarocks安装的模块不在默认目录下,而是在luarocks安装目录/lua_modules目录下。

所以,我们必须在shell启动文件中使用这种方式配置环境变量:

current_dir=$(pwd)
cd /Users/wushu/Develop/luarocks-3.9.2
# 在luarocks安装目录下获取环境变量命令并执行
eval "$(luarocks path)"
cd $current_dir

然后尝试require("socket"),Bingo!

至此,战斗结束,你就可以对luarocks宣布:KO!🎉🎉🎉


其它命令

查看模块信息描述:查看已安装模块的信息描述。

~/Desktop » luarocks show luasocketLuaSocket 3.1.0-1 - Network support for the Lua languageLuaSocket is a Lua extension library composed of two parts: a set of C modules
that provide support for the TCP and UDP transport layers, and a set of Lua
modules that provide functions commonly needed by applications that deal with
the Internet.License:      	MIT
Homepage:     	https://github.com/lunarmodules/luasocket
Installed in: 	/usr/localModules:
......

移除模块

sudo luarocks remove luasocket

协作开发使用方式

luarocks存在两点问题:

  1. 一些模块安装时的名字和require应该使用的名字不一致。如luarocks install luasocket -> require("socket")
  2. luarocks没有提供模块的多版本管理功能。(我没有找到有关的描述)

这在协同开发、长期开发时,会有些困难。

  1. 我是否需要在项目中添加一个文件来介绍项目使用了哪些模块?
  2. 由于没有版本管理,可能团队中的每个人在不同时间安装到的是不同版本的模块,因此,我是否应该把模块放到项目目录下?

这是我在luarocks仓库提的issue。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/22891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bash变量和参数介绍

bash变量和参数介绍 概述 变量可以让程序和脚本语言用来描述数据。一个变量仅仅是一个标签而已,被指定到计算机内存中存储着数据的某个位置或某些位置的标签。变量一般出现在算术运算操作和数量操纵及字符串解析中。 4.1. 变量替换(Variable Substitution) 变量的名…

[containerd] ContentPlugin插件源码分析

文章目录 1. 概述2. 环境3. 注册4. 核心概念4.1. blob4.2. ingest 5. 抽象接口5.1. Manager接口5.2. Provider5.3. IngestManager5.4. Ingester 6. 核心实现6.1. Info6.2. Update6.3. Walk6.4. Delete6.5. ReaderAt6.6. Status6.7. ListStatuses6.8. Abort6.9. Writer 7. 总结 …

Elasticsearch删除文档

根据id删除 例如删除id为110的文档 DELETE /ffbf/_doc/110返回信息 {"_index" : "ffbf","_type" : "_doc","_id" : "110","_version"

MySQL进阶--存储引擎

目录 一、简介二、什么是存储引擎?三、MySQL中常用的存储引擎1.InnoDB2.MyISAM3.Memory4.三种存储引擎对比 四、存储引擎的选择PS: 一、简介 本文的内容讲的是MySQL中的存储引擎的相关知识,初步认识MySQL中的存储引擎及各引擎的特点~ 二、什么是存储引…

Redis 安装以及配置隧道连接

目录 1.CentOS 1. 安装Redis 2. Redis 启动和停⽌ 3. 操作Redis 2.Ubuntu 1. 安装Redis 2. Redis 启动/停⽌ 3. 操作 Redis 3.开启隧道 3.1 Xshell 配置隧道 3.2 windTerm 配置隧道 3.3 FinalShell配置隧道 4.可视化客户端连接 Another Redis Desktop Manager 1.Cen…

Unity Image(RawImage) 实现按轴心放大缩小,序列化存储轴心信息,实现编译器窗口保存轴心

工作时分配给我的要实现的功能,写的时候遇到挺多的坑的,在此记录一下 效果 放大缩小的效果 2.编译器扩展窗口记录 实现点 1.Json序列化存储图片轴心位置, 放大倍率,放大所需要的事件 2.用了编译器扩展工具便于保存轴心信息坑点 1.Imag…

深度学习:探究Tensor和Numpy

目录 引言 1 pytorch中Tensor 1.1 什么是Tensor 1.2 为什么需要Tensor 1.3 如何创建Tensor 1.3.1 从已有其他数据结构转化创建为Tensor 1.3.2 随机初始化一个Tensor 1.3.3 从已保存文件加载一个Tensor 1.4 Tensor的特性 1.4.1 丰富的常用函数操作 1.4.2 灵活的dtype和…

maven开发利器:idea安装maven依赖分析插件 Maven Helper,谁用谁知道!

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 这篇博客给大家介绍一款博主实战开发中一直在使用的pom开发分析利器,教大家玩转maven:使用idea安装 Maven Helper 插件,可以分析依…

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图 tbms

 项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&am…

数据结构-链表

🗡CSDN主页:d1ff1cult.🗡 🗡代码云仓库:d1ff1cult.🗡 🗡文章栏目:数据结构专栏🗡 目录 目录 代码总览: 接口slist.h: slist.c: 1.什么是链表 1.1链…

java多线程并发面试题总结(史上最全40道)

1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然"&am…

用C语言构建一个数字识别卷积神经网络

卷积神经网络的具体原理和对应的python例子参见末尾的参考资料2.3. 这里仅叙述卷积神经网络的配置, 其余部分不做赘述,构建和训练神经网络的具体步骤请参见上一篇: 用C语言构建一个手写数字识别神经网路 卷积网络同样采用简单的三层结构,包括输入层con…

思想道德与法治

1【单选题】公民的基本权利是指宪法规定的公民享有的基本的、必不可少的权利。公民的基本权利有不同的类别,公民的通信自由和通信秘密属于 A、人身自由 B、经济社会权利 C、政治权利和自由 D、教育科学文化权利 您的答案:A 参考答案:A 查…

Visual Studio 快捷键

记录一下VS的快捷键,用Xcode几个星期后回到VS一下子有点乱,还好有条件反射在,过了会就都恢复了 目录 跳转快捷键查找快捷键编辑快捷键代码折叠书签操作记忆来源VS一定要装VAssistX插件,下面的快捷键部分是VX提供的。 跳转快捷键 快速打开文件 Alt + Shift + O 快速打开对…

VSCode C/C++多文件编译配置

多文件编译备忘,带注释的地方都需要注意!!! launch.json文件 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387&quo…

ChatGPT在语言辅助翻译和跨文化交流中的应用如何?

ChatGPT在语言辅助翻译和跨文化交流领域中有广泛的应用潜力,可以帮助人们克服语言障碍,促进跨文化交流和理解。以下是详细的讨论: **1. 实时翻译和即时交流:** ChatGPT可以用于实时翻译,使人们能够即时进行跨语言交流…

LNMP搭建以及Discuz论坛部署

目录 LNMP 编译安装 LNMP搭建 Nginx 服务 MySQL 服务 PHP 解析环境 部署 Discuz社区论坛 LNMP 目前成熟的企业网站的应用模式之一,指的是一套协同工作的系统和相关软件,能提供静态页面服务和动态web服务 L linux系统 N nginx网站服务&#xff0…

社区团购行业的解决方案:重塑业务模式,提升效率和质量

社区团购业务正在中国迅速崭露头角,而随着行业的快速发展,也带来了一系列挑战,包括供应链管理、物流配送、产品质量和用户体验等问题。本文将探讨这些问题,并提出一些可能的解决方案。 一、问题和挑战 1.1 供应链管理 对于社区团…

k8s pod数据存储Volumes

一、说在前面的话 在 Kubernetes 的 Deployment 中,您可以使用多种类型的 Volumes 来管理 Pod 中的数据。 作用是用来共享目录及配置,不用在每个pod里进行配置。 本文主要概述怎么使用HostPath、PersistentVolumeClaim、ConfigMap。 二、k8s有哪些Vol…

OC实现GZIP压缩及解压缩

这恍恍的天日晒的大地嗞嗞的作响。这湉湉的阴雨下的祖国母亲到处洪水泛滥。人本不该有三六九等,可这丑陋的阴雨竟然选择性的泄洪到无辜的县区以示人却有三六九等。谁的财产不是财产,谁的生命不是生命?谁特妈的不是母亲养大的? 一首…