コマンドラインツールの設定ファイル
最近は 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
になっています。