はじめに

Hugo(静的サイトジェネレーター)でブログを書いてる際に、諸々の事情で公開したくないページが公開されてしまう事例があった。厳密にいうと、TOPページに出てくる記事の一覧からは見えないが、検索ボックスからそのページに含むキーワードを検索するとそのページが出てきてしまっていた。

フォルダ構成の例

例として、Hugoの記事を格納しているフォルダ構成は以下の通り。

.
├── archetypes
└── content
     ├── posts
     │   └── engineering    <--- 公開したい記事
     ├── private.           <--- ディレクトリ単位で公開したくない記事(今回の対象)
     └── template.
            │
            └── template.md <--- ファイル単位で公開したくない記事(今回の対象)

今回は content/private のフォルダに入っている記事および content/template/template.md というファイルを公開したくないので、その設定方法を考える。

設定方法

方法1. configファイルに指定

Hugoの設定ファイルである config.yamlignoreFiles ディレクティブを追加する。 ※ 設定ファイルの形式が TOMLの場合は config.toml に読み換えてください。

ignoreFiles:
    - content/template/template\.md$ 
    - content/private/.*$

1つ目が content/template/template.md を公開しない設定でこれはほぼそのまま書けば良い。.(ドット)をエスケープ処理する必要があるため、\(バックスラッシュ)を入れている。 2つ目がcontent/privateを公開しない設定であり、こちらは正規表現を使っている。ディレクトリ内のファイルを全て公開したくないので、 .* としている。

上記設定により、検索しても記事が出てこないことを確認。記事のURLに直アクセスした場合も404が出ることを確認。

方法2. frontmatterを使う

Hugoで使える frontmatterを確認し、draft という変数を true にすれば下書きの記事として認識されるので、公開されない。 以下のように公開したくない記事の先頭に以下のスニペットを書けば良い。frontmatterはダッシュ(—)も上下に書く必要があるので注意。

---
draft: true
---

上記設定により、同様に検索しても記事が出てこないことを確認。

どちらの設定方法が良いか

正規表現を使ってパターンに一致する複数の記事を非公開にしたい場合は方法1が良いと思う。一方で単体の記事を非公開にしたい場合はどちらの方法もメリット・デメリットがあると思った。

  • 方法1
    • メリット: どの記事が非公開設定されているかが単一のファイルに設定されている
    • デメリット: 非公開にしたいファイルが増えてくると設定ファイルのボリュームが大きくなる。
  • 方法2
    • メリット: 記事単位で非公開の設定ができるので、複数人で記事を書くようなユースケースに適している。
    • デメリット: 設定が複数ファイルに分散するのでどの記事が非公開になっているか調べるのが、方法1と比べると多少手間がかかる。

どちらでもよさそうだが、個人的には設定ファイルに可能な限りまとめたいので、方法1を使うことにした。ただ、方法1と方法2を両方使ってしまうと混乱を招きそうだなと思ったので、複数人でHugoの記事を書く場合はどちらかに統一するか認識を合わせる事が大事だなと思った。