网易首页 > 网易号 > 正文 申请入驻

使用 Lua 解析配置文件 | Linux 中国

0
分享至

导读:使用 Lua 配置持久化应用设置。

本文字数:4370,阅读时长大约: 5分钟

使用 Lua 配置持久化应用设置。

不是所有的应用都需要配置文件;对很多应用来说,在启动时变得焕然一新对它们更有利。例如,简单的工具就极少需要偏好项和设置在使用过程中保持稳定不变。然而,当你编写一个复杂的应用程序时,如果能让用户设置与应用的交互方式,以及应用与系统交互的方式会很不错。这就是配置文件用来做的事情。本文将讨论一些利用 Lua 进行持久化配置的方法。

选择一种格式

关于配置文件很重要的两点是一致性和可预见性。你不会希望为了保存用户偏好项,将信息转储到文件中,然后再花几天去编码实现“逆向工程”,处理最后出现在文件里的随机信息。

这里用一些常用的 opensource.com。Lua 有一些库可以处理大多数常用的配置格式;在本文中,我会采用 INI 格式。

安装库

Lua 库的核心仓库是 opensource.com。你可以在这个网站搜索库,或者你可以安装并使用luarocks终端命令。

Linux 环境中,你可以从发行版的软件仓库中下载它,例如:

  1. $ sudo dnf install luarocks

在 macOS 上,请使用 opensource.com 或者 opensource.com。在 Windows 上,请使用 opensource.com。

luarocks安装后,你可以使用search子命令来搜索一个恰当的库。如果你不知道库的名字,可以通过关键词来搜索这个库,例如ini、xml或者json,这取决于你想要用这个库做什么。打个比方,你可以搜索inifile`, 这个库被我用来解析 INI 格式的文本文件。

  1. $ luarocks search inifile

  2. Search results:

  3. inifile

  4. 1.0-2 (rockspec) - https://luarocks.org

  5. 1.0-2 (src) - https://luarocks.org

  6. 1.0-1 (rockspec) - https://luarocks.org

  7. [...]

一个开发者容易犯的错误是在系统上安装了这个库却忘了把它和应用打包。这会给没有安装这个库的用户带来麻烦。为了防止这个问题发生,可以使用--tree选项将它安装在项目的本地文件夹中。如果你没有这个项目文件夹,那就先创建这个文件夹再安装库:

  1. $ mkdir demo

  2. $ cd demo

  3. $ luarocks install --tree=local inifile

--tree选项指示luarocks创建一个新文件夹并在其中安装你的库,例如这个例子中的local文件夹。使用这个简单的技巧,你可以将所有你项目要使用的依赖项直接安装到项目文件夹中。

配置代码

首先,在一个名myconfig.ini的文件中创建一些 INI 数据。

  1. [example]

  2. name=Tux

  3. species=penguin

  4. enabled=false

  5. [demo]

  6. name=Beastie

  7. species=demon

  8. enabled=false

将这个文件保存到你的主目录下,命名为myconfig.ini, 不要 存到项目文件夹下。你通常会希望配置文件独立于你的文件存在,这样当用户卸载你的应用时,使用应用时产生的数据可以保存在系统中。有些用户会删除不重要的配置文件,但大多数不会。最终,如果他们要重装这个应用,还会保留着所有的用户偏好项。

配置文件的位置以技术来说并不重要,但每一个操作系统都有存储它们的特定或者默认的路径。在 Linux 中,这个路径由 www.freedesktop.org 指定。它规定配置文件被保存在一个名为~/.config的隐藏文件夹中。为了操作时更加清晰明确,可以在主目录下存储配置文件,以便于使用和寻找。

创建第二个文件,命名为main.lua,并在你喜欢的文本编辑器中打开它。

首先,你必须告诉 Lua 你将想要使用的附加库放置在哪里。package.path变量决定了 Lua 到哪里去寻找这些库。你可以从终端中查看 Lua 默认的包地址:

  1. $ Lua

  2. > print(package.path)

  3. ./?.lua;/usr/share/lua/5.3/?.lua;/usr/share/lua/5.3/?/init.lua;/usr/lib64/lua/5.3/?.lua;/usr/lib64/lua/5.3/?/init.lua

在你的 Lua 代码中,将你本地库的路径添加到package.path中:

  1. package.path = package.path .. ';local/share/lua/5.3/?.lua

使用 Lua 解析 INI 文件

当包的位置确定以后,下一件事就是引入inifile库并处理一些操作系统逻辑。即使这是一个很简单的应用,代码也需要从操作系统获取到用户主目录的路径,并建立在必要时将文件系统路径返回给操作系统的通信方式。

  1. package.path = package.path .. ';local/share/lua/5.3/?.lua

  2. inifile = require('inifile')

  3. -- find home directory

  4. home = os.getenv('HOME')

  5. -- detect path separator

  6. -- returns '/' for Linux and Mac

  7. -- and '\' for Windows

  8. d = package.config:sub(1,1)

现在你可使用inifile来从配置文件解析数据到 Lua 表中。一旦这些数据被导入进表中,你可以像查询其他的 Lua 表一样查询它。

  1. -- parse the INI file and

  2. -- put values into a table called conf

  3. conf = inifile.parse(home .. d .. 'myconfig.ini')

  4. -- print the data for review

  5. print(conf['example']['name'])

  6. print(conf['example']['species'])

  7. print(conf['example']['enabled'])

在终端中运行代码可以看见结果:

  1. $ lua ./main.lua

  2. Tux

  3. penguin

  4. false

这看起来是正确的。试试在demo块中执行同样的操作。

使用 INI 格式存储数据

不是所有用来解析的库都会读写数据(通常被称为 _编码 和 解码),但是inifile会这样做。这意味着你可以使用它对配置文件进行修改。

为了改变配置文件中的值,你可以对被解析的表中的变量进行设置,然后把表重写回配置文件中。

  1. -- set enabled to true

  2. conf['example']['enabled'] = true

  3. conf['demo']['enabled'] = true

  4. -- save the change

  5. inifile.save(home .. d .. 'myconfig.ini', conf)

现在再来看看配置文件:

  1. $ cat ~/myconfig.ini

  2. [example]

  3. name=Tux

  4. species=penguin

  5. enabled=true

  6. [demo]

  7. name=Beastie

  8. species=demon

  9. enabled=true

配置文件

按照用户的设想来存储数据对程序来说是至关重要的。幸运的是,这对工程师来说是一个很常规的任务,大多数工作可能早已被完成了。只要找到一个好用的库完成开放格式下编码和解码,你就能为用户提供一致且持续的体验。

以下是完整的演示代码,可供参考。

  1. package.path = package.path .. ';local/share/lua/5.3/?.lua'

  2. inifile = require('inifile')

  3. -- find home directory

  4. home = os.getenv('HOME')

  5. -- detect path separator

  6. -- returns '/' for Linux and Mac

  7. -- and '\' for Windows

  8. d = package.config:sub(1,1)

  9. -- parse the INI file and

  10. -- put values into a table called conf

  11. conf = inifile.parse(home .. d .. 'myconfig.ini')

  12. -- print the data for review

  13. print(conf['example']['name'])

  14. print(conf['example']['species'])

  15. print(conf['example']['enabled'])

  16. -- enable Tux

  17. conf['example']['enabled'] = true

  18. -- save the change

  19. inifile.save(home .. d .. 'myconfig.ini', conf)


via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

LCTT 译者 :wangzequan

翻译: 4.0 篇

贡献: 191 天

2022-05-02

2022-11-08

https://linux.cn/lctt/hadisi1993

欢迎遵照 CC-BY-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
后续:“我想杀他的心都有”,小儿子的出生记录上,都是堂哥签字

后续:“我想杀他的心都有”,小儿子的出生记录上,都是堂哥签字

观史搜寻着
2026-05-29 03:09:23
上海最后一条南北地铁来了!预计2027年北段先通,这几个区居民要笑醒

上海最后一条南北地铁来了!预计2027年北段先通,这几个区居民要笑醒

林子说事
2026-06-01 12:11:24
许晋亨夫妇真的很穷,拥有420亿信托里每月只能领200万港币

许晋亨夫妇真的很穷,拥有420亿信托里每月只能领200万港币

西楼知趣杂谈
2026-06-01 21:30:19
释永信在监狱能申请吃素不能

释永信在监狱能申请吃素不能

熊太行
2026-05-30 14:45:23
电子眼抓拍有规律!记住7点,2026开车全年不扣分不被罚真的不难

电子眼抓拍有规律!记住7点,2026开车全年不扣分不被罚真的不难

沙雕小琳琳
2026-05-31 14:51:29
患白血病5年后康复!43岁演员于笑官宣求婚,女友是自己主治医生

患白血病5年后康复!43岁演员于笑官宣求婚,女友是自己主治医生

TVB的四小花
2026-06-01 17:10:27
预言:到2035年的中国,很有可能是这样的,赶紧一起来看看

预言:到2035年的中国,很有可能是这样的,赶紧一起来看看

洛川融媒科技
2026-05-31 13:00:31
看完网友的三观炸裂经历,下巴都惊掉地上了!

看完网友的三观炸裂经历,下巴都惊掉地上了!

夜深爱杂谈
2026-05-29 07:53:20
《主角》结局:刘亿没死,刘红兵没出车祸,易青娥选宋雨继承衣钵

《主角》结局:刘亿没死,刘红兵没出车祸,易青娥选宋雨继承衣钵

嘴角上翘的弧度
2026-06-02 03:20:33
日本62岁皇后复出,中日关系迎历史转折

日本62岁皇后复出,中日关系迎历史转折

空谷幽幽蓝
2026-06-01 11:10:37
奚梦瑶婚礼晚宴,4700万珠宝上身,谷爱凌拎24万爱马仕赴宴成陪衬

奚梦瑶婚礼晚宴,4700万珠宝上身,谷爱凌拎24万爱马仕赴宴成陪衬

好贤观史记
2026-06-01 11:38:36
发现没有?还有七天高考!社会上这5个反常现象,跟往年大不相同

发现没有?还有七天高考!社会上这5个反常现象,跟往年大不相同

神牛
2026-05-30 17:00:31
中美两军在夏威夷见面 中方当场划下两条“红线”

中美两军在夏威夷见面 中方当场划下两条“红线”

看看新闻Knews
2026-06-02 00:34:25
嘴上骂资本主义,身体却最诚实地享受资本主义

嘴上骂资本主义,身体却最诚实地享受资本主义

廖保平
2026-05-31 09:00:01
新华社下场,耿同学又抛出4条大鱼!

新华社下场,耿同学又抛出4条大鱼!

仕道
2026-05-30 09:52:28
暴走团200人夜闯国道,喊话无人理,司机一脚油门:让你走个痛快

暴走团200人夜闯国道,喊话无人理,司机一脚油门:让你走个痛快

徐侠客有话说
2025-07-28 13:40:47
轻松一刻:金庸小说中最有逼格的一段话!

轻松一刻:金庸小说中最有逼格的一段话!

莱月昂
2026-05-31 17:42:24
切特抢七大战出场超30分钟仅出手2次!NBA季后赛历史首人

切特抢七大战出场超30分钟仅出手2次!NBA季后赛历史首人

北青网-北京青年报
2026-06-01 20:34:10
第8名也有奖励!张雪机车获赠国产手机+电脑 德比斯举围巾感谢

第8名也有奖励!张雪机车获赠国产手机+电脑 德比斯举围巾感谢

念洲
2026-06-01 16:20:43
又是第八!张雪喊话WSBK官方:限制85%动力跑高速赛道,怎么玩?

又是第八!张雪喊话WSBK官方:限制85%动力跑高速赛道,怎么玩?

童叔不飙车
2026-06-01 21:48:45
2026-06-02 08:43:00
Linux
Linux
Linux 中国开源社区
8018文章数 73112关注度
往期回顾 全部

科技要闻

英伟达RTX Spark 很猛,但首批机型不便宜

头条要闻

牛弹琴:伊朗突然发飙 特朗普急了被迫打了一个电话

头条要闻

牛弹琴:伊朗突然发飙 特朗普急了被迫打了一个电话

体育要闻

杰威:如果我没受伤,我们能击败马刺

娱乐要闻

奚梦瑶婚礼现场图!一双儿女当花童

财经要闻

宇树过会,杭州赢麻了

汽车要闻

奇瑞集团5月销量24.8万辆 同比增长20.5% 出口18.2万辆再创新高

态度原创

旅游
时尚
亲子
家居
艺术

旅游要闻

“海南之夜”旅游专场欢迎活动举行 海外旅行商共赴海南之约

安妮海瑟薇40岁后美出新高度, 开挂的关键原来是这个

亲子要闻

国家卫生健康委:我国儿童健康水平持续提升……一起来听健康早闻!2026年6月2日

家居要闻

自信舒展 高背座椅

艺术要闻

周杰伦花 1.36 亿拍下的这幅画

无障碍浏览 进入关怀版