使用Lua配置持久化应用设置。并非所有应用程序都需要配置文件;对于许多应用程序来说,最好重新开始。例如,简单的工具很少需要偏好和设置在整个使用过程中保持不变。但是,当您编写复杂的应用程序时,最好让用户设置他们与应用程序的交互方式以及应用程序与系统的交互方式。这就是配置文件的用途。本文将讨论一些使用Lua进行持久化配置的方法。选择格式关于配置文件,有两点很重要:一致性和可预测性。您不想为了保存用户首选项而将信息转储到文件中,然后花费数天时间编码以“逆向工程”最终出现在文件中的随机信息。这里使用了一些常见的配置文件格式。Lua拥有可以处理大多数常见配置格式的库;在本文中,我将使用INI格式。Lua库的核心存储库是Luarocks.org。可以在本站搜索库,也可以安装使用luarocks终端命令。在Linux上,您可以从发行版的软件存储库下载它,例如:$sudodnfinstallluarocks在macOS上,使用MacPorts或Homebrew。在Windows上,使用Chocolatey。安装luarocks后,您可以使用search子命令搜索合适的库。如果你不知道库的名称,可以通过关键字搜索库,例如ini、xml或json,具体取决于你要使用库的用途。例如,您可以搜索inifile`,这是我用来解析INI格式文本文件的库。$luarocks搜索inifile搜索结果:inifile1.0-2(rockspec)-https://luarocks.org1.0-2(src)-https://luarocks.org1.0-1(rockspec)-https://luarocks.org[...]一个常见的开发人员错误是在系统上安装库而忘记将其与应用程序打包在一起。这可能会给没有安装该库的用户带来问题。为防止出现此问题,可以使用--tree选项将其安装在项目的本地文件夹中。如果你没有这个项目文件夹,在安装库之前创建它:$mkdirdemo$cddemo$luarocksinstall--tree=localinifile--treeOption指示Luarocks创建一个新文件夹并在其中安装你的库,例如本例中的本地文件夹。使用这个简单的技巧,您可以将项目将使用的所有依赖项直接安装到项目文件夹中。配置代码首先,在名为myconfig.ini的文件中创建一些INI数据。[example]name=Tuxspecies=penguinenabled=false[demo]name=Beastiespecies=demonenabled=false将此文件保存到您的主目录,将其命名为myconfig.ini,不要将其保存到项目文件夹。您通常会希望配置文件独立于您的文件而存在,这样当用户卸载您的应用程序时,使用该应用程序产生的数据可以保存在系统中。有些用户会删除不重要的配置文件,但大多数不会。最终,如果他们重新安装该应用程序,所有用户首选项都将保留。配置文件的位置在技术上并不重要,但每个操作系统都有特定或默认的存储路径。在Linux中,此路径由Freedesktop规范指定。它指定配置文件保存在名为~/.config的隐藏文件夹中。为了使操作更清晰,配置文件可以存放在主目录下,方便使用和查找。创建第二个文件,将其命名为main.lua并在您喜欢的文本编辑器中打开它。首先,您必须告诉Lua在哪里放置您要使用的附加库。package.path变量决定了Lua将在哪里寻找这些库。可以在终端查看Lua的默认包地址:$Lua>print(package.path)./?.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代码中,将你本地库的路径添加到包中的.path中:package.path=package.path..';local/share/lua/5.3/?.lua使用Lua解析ini文件当包的位置确定后,接下来就是导入ini文件库并处理一些操作系统逻辑。尽管这是一个简单的应用程序,但代码需要从操作系统获取用户主目录的路径,并在必要时建立一种将文件系统路径传回操作系统的方法。package.path=package.path..';local/share/lua/5.3/?.luainifile=require('inifile')--找到主目录home=os.getenv('HOME')--检测路径分隔符--Linux和Mac返回'/'--Windows返回'\'=package.config:sub(1,1)现在您可以使用inifile将配置文件中的数据解析到Lua表中。一旦数据被导入到表中,您就可以像查询任何其他Lua表一样查询它。--解析INI文件并--将值放入名为confconf=inifile的表中。parse(home..d..'myconfig.ini')--打印数据以供审查打印(conf['example']['name'])print(conf['example']['species'])print(conf['example']['enabled'])在终端中运行代码以查看结果:$lua./main.luaTuxpenguinfalse这看起来是正确的。尝试在演示块中做同样的事情。以INI格式存储数据并非所有解析库都读取和写入数据(通常称为_encoding和decoding),但inifile可以。这意味着您可以使用它来更改配置文件。要更改配置文件中的值,可以在已解析的表中设置变量,然后将这些表重写回配置文件中。--设置enabled为trueconf['example']['enabled']=trueconf['demo']['enabled']=true--保存更改inifile.save(home..d..'myconfig.ini',conf)现在看配置文件:$cat~/myconfig.ini[example]name=Tuxspecies=penguinenabled=true[demo]name=Beastiespecies=demonenabled=true配置文件按照用户的想象存储数据。批判的。幸运的是,这对工程师来说是一项例行任务,大部分工作可能已经完成。只要找到一个好的库,以开放的格式进行编码和解码,就可以为用户提供一致且一致的体验。下面是完整的演示代码,供您参考。package.path=package.path..';local/share/lua/5.3/?.lua'inifile=require('inifile')--找到主目录home=os.getenv('HOME')--检测路径分隔符--对于Linux和Mac返回'/'--对于Windowsd=package.config:sub(1,1)返回'\'--解析INI文件并--将值放入名为confconf=inifile.parse(home..d..'myconfig.ini')--打印数据以供审查print(conf['example']['name'])print(conf['example']['species'])print(conf['example']['enabled'])--enableTuxconf['example']['enabled']=true--保存更改ini文件.save(home..d..'myconfig.ini',conf)
