[Hugo] 記事ファイル生成時のhugo new コマンドで引数のように値を渡す方法【環境変数を使ってみた】
![アイキャッチ画像](/img/article/2021/01/10/00-eye-catch.png)
Nプログラマ(@Nprog128)です。
Hugoでは記事用のマークダウンファイルを生成するために、hugo new “記事の出力パス”を使っていると思います。
archetypeにひな形を書いておくと、その内容に沿ってファイルが出力されますよね。
自分もコマンドでひな形を作っているのですが、、、
ドキュメントを見た限り、コマンドラインからの引数を受け取ることはできないようです。
rubyとかの小さなスクリプトでhugoのコマンドをラップして、ゴリゴリと書けばいいとは思うのですが、、、
ちょっとしたアイデアが降ってきたので、それでできるかを試してみます。
そのアイデアとは、、、
ということで、envコマンドとhugoのgetenv関数を組み合わせて、引数を受け取って表示する、ということをやっていきます。
最終的なコマンドはこんな感じになります。
1\$ env ARG01=sample hugo new post/sample01.md
ざっくりと説明するとenvコマンドで一時的な環境変数を定義してarchetypeの中でgetenv関数を使って環境変数から値を取得するということですね(息継ぎなし + 早口)
環境
アプリ名 | バージョン |
---|---|
Mac OSX | 10.13.6 High Sierra |
Hugo | v0.69.2 |
envコマンドを使う
hugoのgetenv関数で環境変数を受け取れるように、今回の主役であるenvコマンドを使います。
他のコマンドを組み合わせて使うと、一時的に環境変数を設定しながらコマンドを実行することができます。
例えば、printenvコマンドと組み合わせると、以下のように実行することができます。
1> env HOGE=FUGA printenv HOGE (git)-[master]
2FUGA
ちなみにHOGEは通常の状態では環境変数として定義していないので、envコマンドなしの状態では何も表示されません。
1> printenv HOGE
2# 何も表示されない
envコマンドを実行して一時的に環境変数を書き換えても、コマンドを実行する前と実行した後の既存の環境変数に変化がないのが良いトコロです。
もちろん使い捨ての環境変数を定義してもいいと思います。
自分は他の環境変数名と被ったりする場合を考慮して、名前を考えるのが精神衛生上モヤモヤするので、envコマンドを使いました。
接頭辞にHUGOとかつけてあげたりするのも1つの手だと思いますし、環境もそれぞれだと思うのでお好みの方法で、、、
Hugoの方で環境変数の値を受け取る
さて、envで環境変数を宣言することができました。
次は、Hugo側で環境変数を受け取ります。
newコマンドでパスを指定する時にはarchetypeの雛形ファイルが使われます。
この雛形の中でgetenv関数を呼び出せば、envコマンドで指定した環境変数の値を取得することができます。
サンプルを作ってみると、こんな感じです。
サンプル コードを開く
1{{ $hoge := getenv "Hoge" }}
2{{ $hoge }}
Hogeという環境変数(値はFuga)をenvで指定しておき、hugoの方ではgetenv関数を使ってHogeの中身を取得し、表示をしています。
Hugoのひな形で取得と表示をしてみる
準備が整ったので、実際のarchetypeを作っていきたいと思います。
今回のarchetypeのディレクトリ構造はこのようになります。
1> tree archetypes (git)-[master]
2archetypes
3└── default.md
次はdefault.mdのひな形の中身を見ていきましょう。
とりあえずtitle, date, draftの要素は設定しておきました。
default.md コードを開く
1---
2title: "{{ .Name }}"
3date: {{ .Date }}
4draft: true
5---
6{{ $arg01 := getenv "HUGO_ARG01" }}
7{{ $arg02 := getenv "HUGO_ARG02" }}
8{{ $arg01 }}
9{{ $arg02 }}
今回envコマンドで指定する環境変数は以下の2つです。
- HUGO_ARG01
- HUGO_ARG02
変数名は被らなければ何でもいいと思うので、自分の分かりやすい名前を使えばいいと思います。
これらの環境変数をgetenv関数にて取得して、$arg01と$arg02の変数に格納しています。
あとはその値をそのまま出力です。
それでは実行してみましょう。
先程の2つの環境変数をenvコマンドに指定して、hugo newコマンドを実行します。
1\$ env HUGO_ARG01=hoge HUGO_ARG02=fuga hugo new post/sample01.md
実行結果は以下のようになりました。
1---
2title: "sample01"
3date: 2021-01-10T18:55:40+09:00
4draft: true
5---
6
7
8hoge
9fuga
envコマンドで指定したHUGO_ARG01とHUGO_ARG02の中身が、hogeとfugaで表示されていることを確認できました。
これはテンプレートの構文の{{- -}}を使えば解消されるはずです。
ひな形は記事を書く上で色々と書き直しをするので、自分はあまり気にしないようにしています。
これを使えば、引数に応じて何かテンプレートに出力したい、ということに使えるかもしれませんね。
おわりに
今回は、Hugoのnew post コマンド実行で環境変数を使って引数のように受け取り出力する、という内容でした。
hugoの記事を生成するコマンド実行時に引数のように使えると、ひな形から生成する段階で出来ることが広がるので便利だと思います。
ただ、作っておいてなんですが、
とか、思ったりします(笑)
JSONとか渡せると引数に応じた変数名を考えなくてもいいかも、、、とか思ったり(実行していないので、できるかどうかも分かりませんが)
JSONを解析するのは、transform.Unmarshalで出来ると思いますし。
それでは、このへんで。
バイナリー!