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

使用 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.

相关推荐
热点推荐
当年造成毛岸英牺牲的3个凶手身份曝光,最终下场凄惨!

当年造成毛岸英牺牲的3个凶手身份曝光,最终下场凄惨!

方圆文史
2022-12-29 13:18:38
俄军将军怒批俄国防部!给俄军士兵穿的制服质量太差

俄军将军怒批俄国防部!给俄军士兵穿的制服质量太差

夜相思
2024-06-14 09:59:52
微软官宣:停服!这款AI工具,仅存活三个月就被“斩杀”!没有盈利希望还是不敌OpenAI?

微软官宣:停服!这款AI工具,仅存活三个月就被“斩杀”!没有盈利希望还是不敌OpenAI?

每日经济新闻
2024-06-13 13:04:09
闹大了!律师:王思聪若拒养孩子或涉遗弃罪?

闹大了!律师:王思聪若拒养孩子或涉遗弃罪?

皖声微言
2024-06-13 11:56:58
铁头撒尿的影响来了,日本入境审查收紧,多名中国人被直接遣返!

铁头撒尿的影响来了,日本入境审查收紧,多名中国人被直接遣返!

十原故里
2024-06-12 23:12:06
笑不活了,网友发现自家向日葵一身反骨背对太阳,网友:抗日呢!

笑不活了,网友发现自家向日葵一身反骨背对太阳,网友:抗日呢!

看晓天下事
2024-06-12 11:39:37
岳母问女婿为什么带安全套,女婿:你女儿,都没有这样对我

岳母问女婿为什么带安全套,女婿:你女儿,都没有这样对我

贵州安美吖
2024-04-25 18:33:31
“一块遮盖白布”引发的热议 艾森豪威尔号航母真的被打中了?

“一块遮盖白布”引发的热议 艾森豪威尔号航母真的被打中了?

武器知识
2024-06-12 22:00:37
家长:公务员是继承制,张雪峰急了:认知错误,公务员选拔很公平

家长:公务员是继承制,张雪峰急了:认知错误,公务员选拔很公平

苏南流
2024-06-13 15:01:18
温网宣布2024年奖金分配,突破5000万英镑大关

温网宣布2024年奖金分配,突破5000万英镑大关

全网球APP
2024-06-14 06:40:30
性感港星庆生超60位艺人到贺!造型夸张,大晒导弹身材

性感港星庆生超60位艺人到贺!造型夸张,大晒导弹身材

我爱追港剧
2024-06-11 12:15:24
中国歼16水平跟苏27差不多,连苏30都打不过?这到底是不是真的?

中国歼16水平跟苏27差不多,连苏30都打不过?这到底是不是真的?

慎独赢
2024-06-04 21:30:03
喜讯!吴少聪即将跟土超球队签订新合同,已拒绝重返中超赚高薪

喜讯!吴少聪即将跟土超球队签订新合同,已拒绝重返中超赚高薪

罗掌柜体育
2024-06-14 10:34:49
全面停止生产!江苏知名半导体大厂破产清算,疑似资金链断裂

全面停止生产!江苏知名半导体大厂破产清算,疑似资金链断裂

美人茶话会
2024-06-13 20:33:17
指谁呢?李璇:某位国脚此前因伤离开国家队,换帅后又说踢不了

指谁呢?李璇:某位国脚此前因伤离开国家队,换帅后又说踢不了

直播吧
2024-06-13 16:12:14
头顶上直接飞越,中方与荷兰爆发短兵相接,飞豹超低空掠飞护卫舰

头顶上直接飞越,中方与荷兰爆发短兵相接,飞豹超低空掠飞护卫舰

文雅笔墨
2024-06-12 12:29:56
大家的消费降级有多严重?看网友的评论引起万千共鸣

大家的消费降级有多严重?看网友的评论引起万千共鸣

骗子
2024-06-09 00:24:29
陈海仪你出来说话啊!你是个知名大法官。骑共享单车出了事找谁?

陈海仪你出来说话啊!你是个知名大法官。骑共享单车出了事找谁?

嘿哥哥科技
2024-06-13 13:31:52
炸了!美国大使亲口承认:中国要全面超越美国啦!

炸了!美国大使亲口承认:中国要全面超越美国啦!

仰望沧海
2024-06-12 13:32:06
国民才女武亦姝清华毕业,爸爸简历被扒,网友们都炸了!

国民才女武亦姝清华毕业,爸爸简历被扒,网友们都炸了!

财经要参
2024-06-12 08:23:08
2024-06-14 11:22:44
Linux
Linux
Linux 中国开源社区
8016文章数 73123关注度
往期回顾 全部

科技要闻

马斯克重获信任 豪言特斯拉市值超10个苹果

头条要闻

中专女生杀入全球数学竞赛拿高分 曾觉得自己不配参加

头条要闻

中专女生杀入全球数学竞赛拿高分 曾觉得自己不配参加

体育要闻

乔丹最想单挑的男人走了

娱乐要闻

森林北报案,称和汪峰的感情遭受压力

财经要闻

私募大佬孙强:中国为什么缺少耐心资本

汽车要闻

提供100/240kW双电机版本车型 乐道L60实车曝光

态度原创

数码
艺术
本地
健康
公开课

数码要闻

Realtek加入PCIe 5.0 NVMe SSD控制器赛道

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

晚餐不吃or吃七分饱,哪种更减肥?

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版