実現したいこと

ビルドが通るかどうかだけを確認したい場合、生成物はディスクに残らなくてもよい。むしろpublic/に本番URLの生成物が残ると、hugo serverで起動中の開発サーバーの状態を壊してしまう。

-M(--renderToMemory)オプションを付けると、Hugoは生成物をメモリ上に展開してディスクへ書き出さない。

使い方

hugo-Mを付けるだけである。

$ hugo -M

public/をはじめ、どのディレクトリにもファイルは作られない。既存のpublic/も上書きされないため、hugo serverを起動したままでも安全に実行できる。

hugo serverにも同じオプションを指定できる。

$ hugo server -M

開発サーバーはメモリ上の生成物を配信し、public/には一切書き込まない。ソースを編集して再ビルドが走った場合もpublic/は更新されない。

ビルドエラーは通常どおり検出される

-Mを付けてもビルドエラーの検出とプロセスの終了ステータスは変わらない。存在しないショートコードを含む記事を置いて実行すると、エラーが出力され終了ステータスは1になる。

$ hugo -M
Start building sites …

Total in 230 ms
Error: error building site: process: readAndProcessContent: "content/hugo/broken/index.md:6:1": failed to extract shortcode: template for shortcode "nonexistent_shortcode" not found
$ echo $?
1

生成物を必要としないビルドチェックには-Mが適している。

メモリ使用量と引き換えになる

Hugoのドキュメントには、-Mは速い場合があるがメモリを多く消費すると記載されている。

464記事のサイトで/usr/bin/time -lを使って計測した例が以下である。

実行方法実行時間最大メモリ使用量
ディスクへ出力0.85秒約184MB
-Mでメモリへ展開0.82秒約473MB

実行時間の差はわずかで、メモリ使用量は約2.6倍になった。サイトの規模が大きくなるほどメモリ使用量は増えるため、CIのように使用可能なメモリが限られる環境では注意する。

一方でディスクへの書き込みは発生しないため、システムコールの時間(sys)は0.90秒から0.45秒へ半減した。ディスクI/Oを避けたい環境では有効に働く。

-dとは併用できない

hugo server-M-dを同時に指定するとエラーになる。

$ hugo server -M -d /tmp/hugo-check
Error: command error: cannot use --renderToMemory with --destination

メモリ上に展開する指定と出力先の指定は矛盾するため、どちらか一方を選ぶ。

hugoコマンドではエラーにならず-dが無視される。出力先を指定したつもりでファイルが作られず戸惑いやすいため、意図しない併用を避ける。

$ hugo -M -d /tmp/hugo-check
$ test -d /tmp/hugo-check || echo "not created"
not created

生成物を確認したい場合は-dを使う

生成されたHTMLの中身を確認したり、出力されたファイルの一覧を見たりする場合はメモリ上への展開では対応できない。-dpublic/とは別のディレクトリへ出力する。

参考: 【Hugo】-dオプションでビルド結果を別ディレクトリに出力する

参考: hugo | Hugo
参考: hugo server | Hugo