使用 Lua 解析配置文件
使用 Lua 配置持久化應(yīng)用設(shè)置。
不是所有的應(yīng)用都需要配置文件;對很多應(yīng)用來說,在啟動時變得煥然一新對它們更有利。例如,簡單的工具就極少需要偏好項和設(shè)置在使用過程中保持穩(wěn)定不變。然而,當(dāng)你編寫一個復(fù)雜的應(yīng)用程序時,如果能讓用戶設(shè)置與應(yīng)用的交互方式,以及應(yīng)用與系統(tǒng)交互的方式會很不錯。這就是配置文件用來做的事情。本文將討論一些利用 Lua 進(jìn)行持久化配置的方法。
選擇一種格式
關(guān)于配置文件很重要的兩點是一致性和可預(yù)見性。你不會希望為了保存用戶偏好項,將信息轉(zhuǎn)儲到文件中,然后再花幾天去編碼實現(xiàn)“逆向工程”,處理最后出現(xiàn)在文件里的隨機(jī)信息。
這里用一些常用的 ??配置文件格式??。Lua 有一些庫可以處理大多數(shù)常用的配置格式;在本文中,我會采用 INI 格式。
安裝庫
Lua 庫的核心倉庫是 ??Luarocks.org??。你可以在這個網(wǎng)站搜索庫,或者你可以安裝并使用 ??luarocks?
? 終端命令。
Linux 環(huán)境中,你可以從發(fā)行版的軟件倉庫中下載它,例如:
在 macOS 上,請使用 ??MacPorts?? 或者 ??Homebrew??。在 Windows 上,請使用 ??Chocolatey??。
??luarocks?
? 安裝后,你可以使用 ??search?
? 子命令來搜索一個恰當(dāng)?shù)膸臁H绻悴恢缼斓拿?,可以通過關(guān)鍵詞來搜索這個庫,例如 ??ini?
?、xml??或者?
?json??,這取決于你想要用這個庫做什么。打個比方,你可以搜索?
?inifile`, 這個庫被我用來解析 INI 格式的文本文件。
一個開發(fā)者容易犯的錯誤是在系統(tǒng)上安裝了這個庫卻忘了把它和應(yīng)用打包。這會給沒有安裝這個庫的用戶帶來麻煩。為了防止這個問題發(fā)生,可以使用 ??--tree?
? 選項將它安裝在項目的本地文件夾中。如果你沒有這個項目文件夾,那就先創(chuàng)建這個文件夾再安裝庫:
??--tree?
? 選項指示 ??luarocks?
? 創(chuàng)建一個新文件夾并在其中安裝你的庫,例如這個例子中的 ??local?
? 文件夾。 使用這個簡單的技巧,你可以將所有你項目要使用的依賴項直接安裝到項目文件夾中。
配置代碼
首先,在一個名 ??myconfig.ini?
? 的文件中創(chuàng)建一些 INI 數(shù)據(jù)。
將這個文件保存到你的主目錄下,命名為 ??myconfig.ini?
?, 不要 存到項目文件夾下。你通常會希望配置文件獨立于你的文件存在,這樣當(dāng)用戶卸載你的應(yīng)用時,使用應(yīng)用時產(chǎn)生的數(shù)據(jù)可以保存在系統(tǒng)中。有些用戶會刪除不重要的配置文件,但大多數(shù)不會。最終,如果他們要重裝這個應(yīng)用,還會保留著所有的用戶偏好項。
配置文件的位置以技術(shù)來說并不重要,但每一個操作系統(tǒng)都有存儲它們的特定或者默認(rèn)的路徑。在 Linux 中,這個路徑由 ??Freedesktop 規(guī)范?? 指定。它規(guī)定配置文件被保存在一個名為 ??~/.config?
? 的隱藏文件夾中。為了操作時更加清晰明確,可以在主目錄下存儲配置文件,以便于使用和尋找。
創(chuàng)建第二個文件,命名為 ??main.lua?
?,并在你喜歡的文本編輯器中打開它。
首先,你必須告訴 Lua 你將想要使用的附加庫放置在哪里。??package.path?
? 變量決定了 Lua 到哪里去尋找這些庫。你可以從終端中查看 Lua 默認(rèn)的包地址:
在你的 Lua 代碼中,將你本地庫的路徑添加到 ??package.path?
? 中:
使用 Lua 解析 INI 文件
當(dāng)包的位置確定以后,下一件事就是引入 ??inifile?
? 庫并處理一些操作系統(tǒng)邏輯。即使這是一個很簡單的應(yīng)用,代碼也需要從操作系統(tǒng)獲取到用戶主目錄的路徑,并建立在必要時將文件系統(tǒng)路徑返回給操作系統(tǒng)的通信方式。
現(xiàn)在你可使用 ??inifile?
? 來從配置文件解析數(shù)據(jù)到 Lua 表中。一旦這些數(shù)據(jù)被導(dǎo)入進(jìn)表中,你可以像查詢其他的 Lua 表一樣查詢它。
在終端中運行代碼可以看見結(jié)果:
這看起來是正確的。試試在 ??demo?
? 塊中執(zhí)行同樣的操作。
使用 INI 格式存儲數(shù)據(jù)
不是所有用來解析的庫都會讀寫數(shù)據(jù)(通常被稱為 _編碼 和 解碼),但是 ??inifile?
? 會這樣做。這意味著你可以使用它對配置文件進(jìn)行修改。
為了改變配置文件中的值,你可以對被解析的表中的變量進(jìn)行設(shè)置,然后把表重寫回配置文件中。
現(xiàn)在再來看看配置文件:
配置文件
按照用戶的設(shè)想來存儲數(shù)據(jù)對程序來說是至關(guān)重要的。幸運的是,這對工程師來說是一個很常規(guī)的任務(wù),大多數(shù)工作可能早已被完成了。只要找到一個好用的庫完成開放格式下編碼和解碼,你就能為用戶提供一致且持續(xù)的體驗。
以下是完整的演示代碼,可供參考。