Luaを使用して永続的なアプリケーション設定を行います。
すべてのアプリにプロファイルが必要なわけではありません。多くのアプリでは、起動時にリフレッシュされる方が良いでしょう。例えば、シンプルなツールでは、使用中に環境設定や設定を安定して変更する必要はほとんどありません。しかし、複雑なアプリケーションを書いている場合、ユーザーがアプリケーションとインタラクトする方法や、アプリケーションがシステムとインタラクトする方法を設定できるようにするのは良いことです。これが設定ファイルを使う目的です。この記事では、Luaを使って永続的な設定を行う方法について説明します。
フォーマットの選択
プロファイルについて重要なことは、一貫性と予測可能性の2つです。ユーザーのプリファレンスを保存するために情報をファイルにダンプし、何日もかけてコーディングし、ファイルにあるランダムな情報を「リバースエンジニアリング」するようなことはしたくありません。
Luaには、一般的な 設定ファイルのフォーマットフォーマットのほとんどを扱えるライブラリが用意されています。
ライブラリのインストール
Luaライブラリのコアリポジトリは Luarocks.orgです。 このサイトでライブラリを検索することもできますし、インストールしてluarocksターミナルコマンドを使うこともできます。
Linux環境では、例えばディストリビューションのリポジトリからダウンロードできます:
$ sudo dnf install luarocks
macOSでは MacPorts または Homebrew、Windowsでは Chocolateyお使いください。
luarocksがインストールされたら、searchサブコマンドを使って適切なライブラリを検索することができます。ライブラリの名前がわからない場合は、iniやxml、inifileキーワードで検索することができます。
$ luarocks search inifileSearch results:inifile1.0-2 (rockspec) - https://.rg1.0-2 (src) - https://.rg1.0-1 (rockspec) - https://.rg
開発者が犯しやすいミスは、ライブラリをシステムにインストールし、アプリケーションと一緒にパッケージするのを忘れてしまうことです。これは、ライブラリがインストールされていないユーザーに問題を引き起こす可能性があります。この問題を防ぐには、-treeオプションを使って、プロジェクト内のローカル・フォルダにライブラリをインストールします。このプロジェクト・フォルダがない場合は、ライブラリをインストールする前に作成してください:
$ mkdir demo$ cd demo$ luarocks install --tree=local inifile
treeオプションはluarocksに新しいフォルダを作成し、その中にライブラリをインストールするように指示します。 この簡単なトリックを使えば、プロジェクトが使用する全ての依存関係をプロジェクトフォルダに直接インストールすることができます。
設定コード
まず、 myconfig.ini ファイルにINIデータを作成します。
[example]name=Tuxspecies=penguinenabled=falsename=Beastiespecies=demonenabled=false
このファイルをホームディレクトリのプロジェクトフォルダに myconfig.ini として保存します。通常、ユーザーがアプリケーションをアンインストールしたときに、アプリケーションの使用によって生成されたデータをシステムに保存できるように、設定ファイルはファイルから独立して存在するようにします。重要でない設定ファイルを削除するユーザもいますが、ほとんどのユーザは削除しません。結局、アプリを再インストールしても、すべてのユーザー設定が残っています。
設定ファイルの場所は技術的に重要ではありませんが、どのオペレーティングシステムにも、設定ファイルを保存する特定のパスまたはデフォルトのパスがあります。Linuxでは、このパスは Freedesktop 仕様 指定されています。それによると、設定ファイルは~/.configという隠しフォルダに保存されます。操作するときに、よりわかりやすく確実にするために、設定ファイルをホームディレクトリに保存して、使いやすく、見つけやすくすることができます。
2つ目のファイルを作成し、名前を name=Beastieし、お好きなテキストエディタで開いてください。
まず、使用したい追加ライブラリをどこに置くかをLuaに伝える必要があります。package.path変数は、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のコードの package.path ローカルライブラリのパスを追加します:
package.path = package.path .. ';local/share/lua/5.3/?.lua
LuaによるINIファイルの解析
パッケージの場所が決まったら、次にすべきことはinifileライブラリを取り込み、オペレーティング・システム・ロジックの一部を処理することです。これは非常に単純なアプリケーションですが、コードはオペレーティングシステムからユーザーのホームディレクトリへのパスを取得し、必要に応じてオペレーティングシステムにファイルシステムのパスを返す通信をセットアップする必要があります。
package.path = package.path .. ';local/share/lua/5.3/?.luainifile = require('inifile')-- find home directoryhome = os.getenv('HOME')-- detect path separator-- returns '/' for Linux and Mac-- and '\' for Windowsd = package.config:sub(1,1)
inifileを使用すると、設定ファイルからLuaテーブルにデータをパースすることができます。このデータがテーブルにインポートされると、他のLuaテーブルと同様にクエリを実行することができます。
-- parse the INI file and-- put values into a table called confconf = inifile.parse(home .. d .. 'myconfig.ini')-- print the data for reviewprint(conf['example']['name'])print(conf['example']['species'])print(conf['example']['enabled'])
ターミナルでコードを実行し、結果を確認してください:
$ lua ./main.luapenguin
これは正しいようです。同じことをデモブロックでやってみてください。
INIフォーマットによるデータの保存
すべてのライブラリーがデータの読み書きを解析するわけではありませんが、inifileは解析します。つまり、設定ファイルを変更するために使うことができます。
コンフィギュレーション・ファイルの値を変更するには、解析されたテーブルに変数を設定し、そのテーブルをコンフィギュレーション・ファイルに書き戻します。
-- set enabled to trueconf['example']['enabled'] = trueconf['demo']['enabled'] = true-- save the changeinifile.save(home .. d .. 'myconfig.ini', conf)
設定ファイルをもう一度見てみましょう:
$ cat ~/myconfig.ini[example]name=Tuxspecies=penguinenabled=truename=Beastiespecies=demonenabled=true
設定ファイル
ユーザーが思い描いたとおりにデータを保存することは、プログラムにとって非常に重要です。幸いなことに、これはエンジニアにとってはごく日常的な作業であり、ほとんどの作業はすでに済んでいることでしょう。オープン・フォーマットでのエンコードとデコードに適したライブラリを見つけることで、一貫した継続的な体験をユーザーに提供することができます。
package.path = package.path .. ';local/share/lua/5.3/?.lua'inifile = require('inifile')-- find home directoryhome = os.getenv('HOME')-- detect path separator-- returns '/' for Linux and Mac-- and '\' for Windowsd = package.config:sub(1,1)-- parse the INI file and-- put values into a table called confconf = inifile.parse(home .. d .. 'myconfig.ini')-- print the data for reviewprint(conf['example']['name'])print(conf['example']['species'])print(conf['example']['enabled'])-- enable Tuxconf['example']['enabled'] = true-- save the changeinifile.save(home .. d .. 'myconfig.ini', conf)




