実現したいこと
config.tomlに書いた値だけが実際の設定のすべてではない。Hugoの既定値や、CLIフラグ・環境変数による上書きも加わったうえで、最終的にビルドで使われる設定値が決まる。
hugo configを使うと、これらすべてが反映された最終的な設定値をまとめて確認できる。
使い方
hugo configを実行するだけである。既定ではTOML形式で出力される。
$ hugo config
archetypedir = 'archetypes'
assetdir = 'assets'
baseurl = 'https://atsum.in/'
cachedir = '[cache-dir]'
capitalizelisttitles = true
contentdir = 'content'
copyright = '© 2022 suer'
--formatでYAMLやJSONに切り替えられる。
$ hugo config --format json
動作確認: 設定ファイルにない既定値も表示される
config.tomlにsummarylengthやtimeoutといった項目を書いていない場合でも、hugo configの出力には以下のように既定値が入って表示される。
$ hugo config | grep -E "^(summarylength|timeout|publishdir) ="
publishdir = 'public'
summarylength = 70
timeout = '60s'
config.tomlに書いていない項目まで含めて、Hugoが実際に使う値をまとめて確認できる。
値がfalseや0の項目は既定で省略される
falseや0、空文字列といったゼロ値の項目は、既定では出力に含まれない。--printZeroを付けるとゼロ値の項目も表示される。
$ diff <(hugo config) <(hugo config --printZero) | grep "^>" | head -5
> builddrafts = false
> buildexpired = false
> buildfuture = false
> canonifyurls = false
> cascade = []
参考: 【Hugo】--printUnusedTemplatesで未使用テンプレートを検出する
CLIフラグや環境変数による上書きも反映される
hugo configが示すのは設定ファイルの値そのものではなく、CLIフラグや環境変数による上書きを反映した最終的な値である。-b(--baseURL)を付けて実行すると、出力のbaseurlもその値に変わる。
$ hugo config -b "http://localhost:1313/" | grep "^baseurl ="
baseurl = 'http://localhost:1313/'
HUGO_を接頭辞にした環境変数でも同様に上書きできる。
$ HUGO_TITLE="Overridden Title" hugo config | grep "^title ="
title = 'Overridden Title'
設定ファイル・既定値・CLIフラグ・環境変数のどれを変えても、hugo configを実行すれば実際にビルドへ反映される値を確認できる。
環境変数はCLIフラグより優先される
HUGO_BASEURLと-bに別々の値を指定すると、環境変数の値が優先される。
$ HUGO_BASEURL="http://from-env.example/" hugo config -b "http://from-flag.example/" | grep "^baseurl ="
baseurl = 'http://from-env.example/'
contentDir(HUGO_CONTENTDIRと-c)で試しても同じ結果になり、baseURL固有の挙動ではない。
$ HUGO_CONTENTDIR="from-env-dir" hugo config -c "from-flag-dir" | grep "^contentdir ="
contentdir = 'from-env-dir'
優先順位は環境変数・CLIフラグ・設定ファイル・既定値の順である。公式ドキュメントには「環境変数は設定ファイルより優先される」とは明記されているが、CLIフラグとの比較については明記が見当たらなかった。
