このドキュメントでは、HikaeMe テーマを使って Hugo サイトを新規セットアップする手順を説明します。
以下のツールを事前に用意してください。
- Hugo(0.160.0 以上)
- Go(Hugo Modules に必要)
- Git
- Node.js と npm
- GCC(ネイティブ依存のビルドに必要)
- Sass(SCSS コンパイラ)
VS Code 利用者向け(任意)として、Dev Container の実ファイル例を用意しています。
これらのファイルをプロジェクトルートの .devcontainer/ ディレクトリ(例: .devcontainer/devcontainer.json)に配置すると、VS Code から Dev Container として認識されます。
環境確認コマンド:
hugo version
go version
git --version
node --version
npm --version
gcc --versionHikaeMe は Go module のセマンティックインポートバージョニングに従います。
- v1.x.x では
github.com/htnabe/HikaeMeを使います - v2.x.x 以降では
github.com/htnabe/HikaeMe/v2を使います
v2 以降では、リポジトリ直下の go.mod に次の宣言が必要です。
module github.com/htnabe/HikaeMe/v2hugo new site my-blog --format yaml
cd my-blog
git inithugo mod init github.com/yourusername/my-blogこのコマンドでサイトをモジュールとして登録します。モジュール名は最終的な GitHub リポジトリ名と一致していなくても構いませんが、一意である必要があります。
サイト設定に module import を追加します。単一ファイル構成であれば hugo.yaml を編集し、次を追加します。
module:
imports:
- path: "github.com/htnabe/HikaeMe/v2"設定を分割している場合は、同じ内容を config/_default/module.yaml に配置してください。
v1.x.x を使う場合は、代わりに github.com/htnabe/HikaeMe を指定してください。
hugo mod get -u github.com/htnabe/HikaeMe/v2
hugo mod npm pack
npm install設定は次のどちらでも構いません。
- 小規模サイト向け: 単一の
hugo.yaml - 設定が増えたサイト向け:
config/_default/で分割
このリポジトリでは設定量が多いため、config/_default/ を採用しています。典型的な構成は次のとおりです。
config/_default/
hugo.yaml
module.yaml
params.yaml
menus.yaml
outputs.yaml
outputFormats.yaml
permalinks.yaml
hugo server -Dブラウザで http://localhost:1313 を開いて確認します。
title: "My Blog"
baseURL: "https://example.com/"
locale: "ja-JP"
module:
imports:
- path: "github.com/htnabe/HikaeMe/v2"
params:
author: "Your Name"
description: "My personal blog"このガイドでは簡潔さのため単一の hugo.yaml を使っています。設定を分割して管理したい場合は、実リポジトリの例として exampleSite/config/_default/ を参照してください。
skill-set-chart shortcode を使うと、スキルを Bootstrap の progress bar として表示できます。データは params.author.skills に設定し、author ページなどの本文に shortcode を配置します。
params:
author:
skills:
maxYears: 8
groups:
- name: "Programming Languages"
items:
- name: "TypeScript"
years: 5
purpose: "work and hobby"
- name: "Python"
years: 6.3
purpose: "hobby"
- name: "Libraries / Frameworks"
items:
- name: "Bootstrap"
years: 4.5
purpose: "work and hobby"## スキルセット
{{< skill-set-chart >}}maxYears はチャート全体の最大幅を表します。各スキルの years には整数または小数を指定でき、purpose は tooltip に表示されます。
HikaeMe は Hugo の多言語サイト構成に対応しています。
- 推奨構成は、デフォルト言語をルートに置く single host 構成です
- 既存のデフォルト言語 URL をそのまま正規 URL として維持できます
- 追加言語は
/en/のようなプレフィックス配下で公開できます - UI 文言は
i18n/ja.yaml、i18n/en.yamlなどの翻訳ファイルで管理できます
例:
defaultContentLanguage: "ja"
defaultContentLanguageInSubdir: false
languages:
ja:
locale: "ja-JP"
label: "日本語"
weight: 1
en:
locale: "en-US"
label: "English"
weight: 2言語ブロックに定義していない設定値はグローバル設定へフォールバックするため、差分だけを各言語に書く運用が可能です。
Algolia JSON は home kind で生成されます。出力先は defaultContentLanguageInSubdir の値によって変わります。
defaultContentLanguageInSubdir |
既定言語 | 他言語 |
|---|---|---|
false(既定値) |
/algolia.json |
/en/algolia.json |
true |
/<defaultLang>/algolia.json |
/en/algolia.json |
false のとき、ルートの /algolia.json が既定言語のインデックスになります。これは Hugo の仕様通りの動作であり、異常ではありません。なお、このドキュメントのサンプル設定では defaultContentLanguage: "ja" のため、true の場合の既定言語の出力先は /ja/algolia.json になります。
config/_default/outputFormats.yaml
Algolia:
baseName: "algolia"
isPlainText: true
mediaType: "application/json"
notAlternative: trueconfig/_default/outputs.yaml
home:
- "HTML"
- "Algolia"
section:
- "HTML"home だけで生成し section では生成しないことで、重複レコードを防ぎます。
config/_default/params.yaml
enableAlgolia: true
algolia:
appId: "YOUR_APP_ID"
searchOnlyApiKey: "YOUR_SEARCH_ONLY_API_KEY"
indexName: "YOUR_INDEX_NAME"
vars:
- "title"
- "summary"
- "date"
- "permalink"
params:
- "tags"
- "categories"言語ごとに別の Algolia インデックスを使う場合は、言語ブロックで indexName を上書きします。
languages:
ja:
params:
algolia:
indexName: YOUR_JA_INDEX
en:
params:
algolia:
indexName: YOUR_EN_INDEX言語数が増える場合は、ファイル名サフィックス方式よりも言語別ディレクトリ方式 の方が管理しやすくなります。
languages の各言語に contentDir を設定します。
languages:
ja:
contentDir: content/ja
en:
contentDir: content/encontent/
ja/
posts/
tech/
article1.md
about.md
en/
posts/
tech/
article1.md
about.md
cd exampleSite && hugo --gc --minify
# レコード件数(どちらも 0 でないことを確認)
jq 'length' public/algolia.json
jq 'length' public/en/algolia.json
# 言語混在がないことを確認
jq '[.[].permalink | contains("/en/")] | any' public/algolia.json # false であること
jq '[.[].permalink | contains("/en/")] | all' public/en/algolia.json # true であること