Hugo と GitHub Pages を使ってサイトを作る
Hugo は Go で書かれた高速な静的サイトジェネレータ。
1 Hugo をインストールする
Quick Start | Hugo も参照。
Mac の homebrew であれば、hugo
をインストールすればよい:
brew install hugo
以後は hugo
コマンドが利用できるようになる。代表的なのは以下のコマンド:
hugo new site NAME
: 新しいサイトを空っぽで作る。hugo new PATH
: 新しいコンテンツファイルを作る。hugo server
: 足元でサイトが見られるサーバを起動する。hugo
: サイトをビルドする。
2 新しいサイトを作る
Hugo はサイトジェネレータなので、まずやることは空っぽのサイトを作ること。hugo new site
のあとにサイト名を書いて実行する:
hugo new site diary
サイト名のディレクトリが作られるので、移動しておく:
% cd diary
% tree
.
├── archetypes
│ └── default.md
├── config.toml
├── content
├── data
├── layouts
├── static
└── themes
6 directories, 2 files
Directory Structure | Hugo も参照。
3 テーマを入れる
次に、ウェブサイトのデザインを決めるテーマを入れる。
サイト自体を git で管理するなら、git submodule 機能を使うのがよい。Ananke というテーマを使う場合:
git init
git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke
echo 'theme = "ananke"' >> config.toml
git を使わない場合、普通にテーマの中身を含んだディレクトリ theme
ディレクトリ以下にコピーしてもよい。
4 設定ファイルを更新する
さきほどテーマを入れたときに config.toml
にテーマの設定を追記したが、それ以外にも設定を更新した方がよい。
config.toml
を以下のように書き換える:
baseURL = "公開したときのサイトの URL"
hasCJKLanguage = true # 日本語などを含むときは true
languageCode = "言語 (ja-jp)"
theme = "テーマ名 (ananke)"
title = "サイトのタイトル"
5 新しいページを作る
実際にコンテンツとして、たとえば Markdown でページを作ることができる。content
ディレクトリ以下に posts/hello-world.md
という Markdown ファイルを作る:
hugo new posts/hello-world.md
実際に content/posts/hello-world.md
を開いてみると次のような内容になっている。すでに書き込まれている部分は Front matter といい、メタデータになる。その下に、 Markdown で内容を書く。
---
title: "Hello World"
date: 2020-02-15T04:04:41+09:00
draft: true
---
title
: ページタイトルdate
: ページの作成日時draft
: 下書きか否か
画像などのリソースファイルは、 static
ディレクトリ以下に保存すれば自動でアップロードされる。
6 Hugo サーバを起動する
hugo server
コマンドで、足元で Hugo サーバを起動してサイトを見ることができる。-D
オプションを付ければ、下書きのコンテンツも見ることができる。
hugo server -D
http://localhost:1313/ でサイトを開くことができる。
7 静的なページをビルドする
hugo
コマンドで、サイトを静的なページとしてビルドできる。ここでも -D
オプションは利用できる。
hugo -D
public
ディレクトリ以下に HTML ファイルなどが生成される。
8 GitHub Pages にデプロイする
GitHub Pages に Hugo でビルドされたサイトをデプロイすることができる。
<USERNAME>.github.io
という GitHub リポジトリを作っておく。これが GitHub Pages 用リポジトリになる。config.toml
を書き換えて、baseURL = "https://<USERNAME>.github.io/"
にする。- 古い
public
ディレクトリが残っていればいったん削除してから、git submodule add -b master https://github.com/<USERNAME>/<USERNAME>.github.io.git public
で submodule として追加する。 deploy.sh
を用意しておけば、あとはこれを実行すれば自動でデプロイされる。
#!/bin/sh
# If a command fails then the deploy stops.
set -e
printf "\033[0;32mDeploying updates to GitHub...\033[0m\n"
# Remove files for obsolete data.
rm -rf public/*
# Build the project.
hugo
# Push to git.
cd public
git add .
msg="rebuilding site $(date)"
if [ -n "$*" ]; then
msg="$*"
fi
git commit -m "$msg"
git push origin master
上のファイルはほとんど Host on GitHub | Hugo のものと同じだが、もう使われなくなった古いファイルが残ったままデプロイされ続ける問題があるので、rm -rf public/*
を追加している。
9 テーマを作る
hugo new theme
コマンドで、新しいテーマを作ることができる:
hugo new theme NAME
上のコマンドによって次のようなディレクトリ構造が作られる:
% tree themes/NAME
themes/NAME
├── LICENSE
├── archetypes
│ └── default.md
├── layouts
│ ├── 404.html
│ ├── _default
│ │ ├── baseof.html
│ │ ├── list.html
│ │ └── single.html
│ ├── index.html
│ └── partials
│ ├── footer.html
│ ├── head.html
│ └── header.html
├── static
│ ├── css
│ └── js
└── theme.toml
7 directories, 11 files
テーマでは Go テンプレート機能が活用されているので、参照。template - The Go Programming Language
layouts/_default/baseof.html
はベースとなる HTML テンプレート。
<!DOCTYPE html>
<html>
{{- partial "head.html" . -}}
<body>
{{- partial "header.html" . -}}
<div id="main">
{{- block "main" . }}{{- end }}
</div>
{{- partial "footer.html" . -}}
</body>
</html>
- いわゆる
<head>...</head>
にあたる部分は、head.html
部分テンプレートを使うようにしている。なので、別にhead.html
も必要となる。 <body>...</body>
は大きくヘッダ、メイン、フッタの3つに分かれる。ヘッダとフッタはそれぞれheader.html
,footer.html
部分テンプレートを使う。メインだけは少し違っていて、main
ブロックを使っている。
部分テンプレートは layous/partials
ディレクトリにある。hugo new theme
した直後では、layouts/partials/{head,header,footer}.html
ファイルはあるものの、すべて中身は空なので、適切に埋めないといけない。
普通の1記事のレイアウトは、layouts/single.html
が使われる。記事一覧のレイアウトは、lauouts/list.html
が使われる。タグ一覧のようなもののレイアウトは、layouts/terms.html
が使われる。あるタグの記事一覧のようなもののレイアウトは、layouts/taxonomy.html
が使われる。
トップページは layouts/index.html
が使われる。
10 画像を貼り付ける
static
ディレクトリに画像ファイルを配置すれば、その画像ファイルはアップロードされて Markdown なら 
で表示できる。
ページタイトル画像は、テーマによるがたとえば featured_image
を設定すれば行える(参照:[gohugo-theme-ananke#change-the-hero-background](https://github.com/budparr/gohugo-theme-ananke#change-the-hero-background])。
11 関連コンテンツ機能
Related Content | Hugoはあるが、自分が欲しいのは Scrapbox の関連ページリスト機能のような機能。