コマンドラインツールの設定ファイル
最近は XDG (X Desktop Group) Base のディレクトリを使うツールが増えています。
XDG Baseな環境では
$XDG_CONFIG_HOMEという値が定められていればその下に設定ファイルを各種ツールの名前ごとに
ディレクトリを作って置きます。
(ツール名の設定ファイルを直接置く場合もある。)
$XDG_CONFIG_HOMEは通常は~/.configで、$XDG_CONFIG_HOMEが設定されてなければ
~/.configを使う、ということもよくあるかと思います。
だいぶ前はHOMEにdotfileな形で置くものの方が多かったと思います。
例えばVimは~/.vimrcを使いますが、Neovimは~/.config/nvimというディレクトリの下のinit.vimという設定ファイルを使います。
途中で移行したものもあり、そういった場合は古い場所にしかなければそちらを使う、という状態になってたりします。
~/.configを探してなければHOMEのdotfileを探す、と。
さらに、個別のプロジェクトごとなどでも設定できるよう、 現在のディレクトリにdotfileの形で置いてあるとそれを優先して使うものもあります。
また、Gitのレポジトリの中で作業しているときにはそのrootディレクトリを探したりすることもあります。
さらにこれらのディレクトリの位置とともに、
直接.<tool_name>.ymlのような感じでdotfileとして置く場合と、
.<tool_name>というディレクトリの下に
.<tool_name>/conf.ymlのようにファイルを置く場合もあります。
conf-finder
上記のようなディレクトリやファイルの可能性を考慮に入れて 設定ファイルを探すためのPythonライブラリ。
PyPIに公開
してあるのでpipで
1
| |
で入れられます。
(似たような名前のconfig-finderというものもあるので注意。というかこれがあったのでconf-finderにしました。)
デフォルトでは探すディレクトリとして
- 現在のディレクトリ
- Gitのrootディレクトリ(Gitのレポジトリ内にいる場合)
- XDG config home (
$XDG_CONFIG_HOME。設定されてない場合は~/.config。) - HOMEディレクトリ
を探します。
簡単な使い方は
1 2 3 4 5 | |
のような感じ。
mytoolはツールの名前、cf.confのextは設定ファイルの拡張子(もし指定しなければ拡張子なし)。
ファイル検索をする際にはまず上記のディレクトリの順に、
.<tool_name>.ymlのような名前のファイルを探します。
ただし、XDG config homeの下ではdotを外して<tool_name>.ymlを探します。
すべての場所になかった場合、次は.<tool_name>というディレクトリを探します。
ファイルの場合と同様、
XDG config homeの下ではdotを外して<tool_name>を探します。
これらのディレクトリがあり、その中にconf.ymlというファイルがあればそれを返します。
もし見つからなかった場合、デフォルトのファイル場所として、XDG config homeの場所(~/.config/<tool_name>/conf.yml)を返します。
なので、以下のような順番で探すことになります。
./.mytool.yml<git root>/.mytool.yml~/.config/mytool.yml~/.mytool.yml./.mytool/conf.yml<git root>/.mytool/conf.yml~/.config/mytool/conf.yml~/.mytool/conf.yml
もしどれもなかった場合には
~/.config/mytool/conf.yml
が返されます。
直接ファイルベースにするのかディレクトリベースにするのか分けた方が良い気もしてきましたが、 とりあえず一旦こういう感じで。
追記: 2023/09/24
ConfFinderにconf_typeという引数を渡せるようにして、これが
both: ファイル、ディレクトリ両方 (デフォルト)file: 直接ファイルベースのみdir: ディレクトリベースのみ
を探すようにしました。
1 2 3 4 5 | |
なら
./.mytool.yml<git root>/.mytool.yml~/.config/mytool.yml~/.mytool.yml
を探して見つからなければ
~/.config/mytool.ymlを返します。
追記ここまで
conf-finderのその他オプション
ファイルは無視してディレクトリを検索
1
| |
とすると
./.mytool<git root>/.mytool~/.config/mytool~/.mytool
を探して見つかったディレクトリを返します。どれもなければ
~/.config/mytool。
設定ファイル名の変更
1
| |
のような形でfile_nameを指定すると、
./.my_conf.yml<git root>/.my_conf.yml~/.config/my_conf.yml~/.my_conf.yml./.mytool/my_conf.yml<git root>/.mytool/my_conf.yml~/.config/mytool/my_conf.yml~/.mytool/my_conf.yml
といった感じに、直接ファイルを探す際にはfile_nameを、
ディレクトリを探す場合にはmytoolのディレクトリを探しその中にfile_nameのファイルを探します。
探索ディレクトリの変更
ConfFinderへの引数で
search_dir_listへディレクトリのリストを渡すとそのディレクトリを探すようになります。
1
| |
とすると、リストの順に探索し、/etc/.mytool.ymlや/etc/.mytool/conf.ymlも探します。
基本的に渡したものはそのままディレクトリパスとして解釈されますが、上にもあるような 一部の単語は中で変換されます。
cwd: 現在のディレクトリgit,git_root: Gitのrootディレクトリxdg,xdg_config_home: XDG config homehome: HOMEディレクトリ
dotをつけないディレクトリの指定
上にもあるようにXDG config homeの下の場合のみdotをつけない形にします。 これを変更するには
1
| |
のようにConfFinderのnon_dot_dirにリストを渡します。
初期値はxdg_config_homeのみです。
デフォルトファイルの変更
すべて見つからなかった場合に使うファイルの位置を変更するには
1
| |
のようにdefault_dirに指定します。
初期値はxdg_config_homeになっています。
