Redian新闻
>
使用 Lua 解析配置文件 | Linux 中国

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

科技
 
导读:使用 Lua 配置持久化应用设置。                                           
本文字数:4370,阅读时长大约:5分钟

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

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

选择一种格式

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

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

安装库

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

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

  1. $ sudo dnf install luarocks

在 macOS 上,请使用 MacPorts🔗 opensource.com 或者 Homebrew🔗 opensource.com。在 Windows 上,请使用 Chocolatey🔗 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 中,这个路径由 Freedesktop 规范🔗 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: https://opensource.com/article/21/6/parsing-config-files-lua

作者:Seth Kenlon 选题:lujun9972 译者:hadisi1993 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

LCTT 译者 :wangzequan
🌟🌟
翻译: 4.0 篇
|
贡献: 191 天
2022-05-02
2022-11-08
https://linux.cn/lctt/hadisi1993
欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
在 Linux 上试试这个 Java 文件管理器 | Linux 中国If Communist party falls, will China let Tibet, Xinjiang, Hong KLinux inxi 命令的 3 种使用方法 | Linux 中国一不小心成了密接,中秋节团圆饭俺俩居然没同时坐在餐桌前使用 PCManFM 文件管理器让你的 Linux PC 轻装上阵 | Linux 中国bāo huā shēng?bō huā shēng?为什么你要在 Linux 上尝试 Nemo 文件管理器? | Linux 中国Rosalía 登意大利版《VOGUE》封面!System 76 将不会发布 Pop!_OS 22.10 Linux 发行版 | Linux 中国10 大可以摧毁你的 Linux 的命令 | Linux 中国试试这个 Linux 网络浏览器作为你的文件管理器 | Linux 中国GNOME “文件”引入最受欢迎的功能:“新建文件”菜单 | Linux 中国使用 Podman Desktop 在 Fedora Linux 上管理容器 | Linux 中国Tuxedo 已对所有用户开放基于 Ubuntu 的 TUXEDO OS | Linux 中国使用这个多功能的 Linux 命令转换音频文件 | Linux 中国传统的 Linux 软件包格式不适合现代应用 | Linux 中国用 Lua 解析参数 | Linux 中国在 Linux 中使用 “Converter” GUI 工具转换和操作图像 | Linux 中国如何在最小安装的 CentOS、RHEL、Rocky Linux 中设置互联网 | Linux 中国我如何使用现场 USB 设备恢复我的 Linux 系统 | Linux 中国开源朗读者:使用 Linux 的优势和劣势 | Linux 中国夏末西海岸自驾游:行程与小结一卢布等于一元人民币中国大学校训没有“自由”二字一个适用于苹果芯片的原生 Linux GPU 驱动程序几乎就绪! | Linux 中国如何在 Linux 中使用 SCP 安全地传输文件 | Linux 中国哇!Torvalds 为自己的 Apple M2 Macbook 专门修改了 Fedora Linux | Linux 中国关于 Linux 和 Git 的创造者 Linus Torvalds 的 20 件趣事 | Linux 中国在 Linux 上试试这个基于 Python 的文件管理器 | Linux 中国如何在 Silverblue 上变基到 Fedora Linux 37 | Linux 中国使用 PSCP 将文件和文件夹从 Windows 传输到 Linux | Linux 中国准备好在 Debian Linux 上获得 Ubuntu MATE 的体验吧! | Linux 中国Atoms 是一个可以让你轻松管理 Linux Chroot 环境的 GUI 工具 | Linux 中国LURE 初窥!将 AUR 带入所有 Linux 发行版 | Linux 中国如何在 Linux 中使用媒体传输协议访问安卓设备的内部存储和 SD 卡 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。