Hugo v0.56 新機能 Modules と deploy

## Hugo v0.56 がリリース

- [Hugo 0.56.0: Hugo Modules and Deployment | Hugo](https://gohugo.io/news/0.56.0-relnotes/)

今回のリリース Hugo v0.56 では Hugo Modules と Hugo deploy の二つの新機能が実装されました。この記事ではそれらの紹介をします。

homebrew-core の Hugo は既に v0.56 へ更新されています。Docker で試したい方は [Docker image of Hugo extended version] を使ってみてください。GitHub Actions で試したい方は [GitHub Actions for Hugo extended] をどうぞ。もちろん [Release v0.56.0 - gohugoio/hugo] からバイナリをダウンロードして実行もできます。

[Docker image of Hugo extended version]: https://github.com/peaceiris/hugo-extended-docker
[GitHub Actions for Hugo extended]: https://github.com/peaceiris/actions-hugo
[Release v0.56.0 - gohugoio/hugo]: https://github.com/gohugoio/hugo/releases/tag/v0.56.0



## Hugo Modules

- [Hugo Modules | Hugo](https://gohugo.io/hugo-modules/)

### 動作要件

Hugo Modules は Go Modules に似た機能であり、実際のところ Go Modules に依存しています。Hugo Modules を利用するには以下がインストールされている必要があります。

- Go 1.12 以上
- Git

v0.55.6 までの Hugo の実行に Go の実行環境は必要ありませんでしたが、今後 Hugo Modules を利用したい場合には必要となります。もちろん Hugo Modules を使わない場合は今まで通りGo言語の実行環境は必要ありません。

個人的には **Netlify で Hugo Modules を利用できるのか** が気になりましたが Netlify は Go 1.12 の実行環境を用意してくれているので、問題なく Hugo Modules を使えます。

**「手元では Go を実行できるけど CI/CD をさせるリモート側でどうしても Go をインストールできない、それでも Hugo Modules の恩恵を受けたい」** のような場合は手元の環境で `hugo mod vendor` を実行して依存をすべて `_vendor` 以下に出力し、それもリモート側に送れば良いです。

### できること

具体的に何ができるかと言うと、以下のような Hugo プロジェクトを構成するコンポーネントを

- static
- content
- layouts
- data
- assets
- i18n
- archetypes
- themes

外部のリポジトリからインポートして利用できるようになりました。Hugo テンプレートが書かれている HTML ファイルや JavaScript, CSS などを異なる Hugo プロジェクト間で使い回せます。

`go get` コマンドのような感じでコンポーネントをプロジェクトにインポートして管理できます。

```
hugo mod get -u github.com/bep/my-theme
```

これまでは公開されている Hugo theme を導入する方法として

- Git submodule
- Zip でダウンロードしてコンテンツ同様に扱う

が主な手段でした。今後は対象の Theme が Hugo Modules での導入に対応していれば、以下のように `config.toml` にテーマのパスを記載しておくだけでインポートができます。

```toml:config.toml
[module]
[[module.imports]]
path="github.com/bep/hugo-fresh"
```

### デモ

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Did we mention that we just released Hugo 0.56.0!? Here&#39;s a short preview of Hugo Modules: <a href="https://twitter.com/hashtag/gohugo?src=hash&amp;ref_src=twsrc%5Etfw">#gohugo</a> <a href="https://twitter.com/hashtag/golang?src=hash&amp;ref_src=twsrc%5Etfw">#golang</a> <a href="https://twitter.com/hashtag/jamstack?src=hash&amp;ref_src=twsrc%5Etfw">#jamstack</a> <a href="https://twitter.com/hashtag/webdev?src=hash&amp;ref_src=twsrc%5Etfw">#webdev</a> <a href="https://twitter.com/hashtag/staticgen?src=hash&amp;ref_src=twsrc%5Etfw">#staticgen</a><a href="https://t.co/42WTmhG9EI">https://t.co/42WTmhG9EI</a> <a href="https://t.co/sr7HdhGc1W">pic.twitter.com/sr7HdhGc1W</a></p>&mdash; GoHugo.io (@GoHugoIO) <a href="https://twitter.com/GoHugoIO/status/1154465419765452801?ref_src=twsrc%5Etfw">July 25, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

動画は Hugo theme の切り替えと partials のインポートを行う様子です。`hugo server` で確認しながらインポート、つまりホットリロードが可能です。

### コマンド

```sh
hugo mod clean   # キャッシュをクリアします。
hugo mod get     # 現在の Hugo プロジェクトの依存を解決します。
hugo mod graph   # モジュールの依存グラフを出力します。
hugo mod init    # Hugo Module として現在のプロジェクトを初期化します。
hugo mod tidy    # go.mod と go.sum から利用されていないものを削除します。
hugo mod vendor  # _vendor ディレクトリにモジュールの依存を保存します。
```

- [bep/my-modular-site: Just a test site](https://github.com/bep/my-modular-site)



## Hugo Deploy

- [Hugo Deploy | Hugo](https://gohugo.io/hosting-and-deployment/hugo-deploy/)

以下のホスティングサービスに `hugo deploy` コマンドでデプロイができるようになりました。

- GCS (Google Cloud Storage )
- S3 (Amazon Simple Storage Service)
- Azure Storage