最近 make をタスクランナーとして使うようになりました。

きっかけはGolangを使い始めた時にみんなのGo言語を読んだことです。(改訂2版でましたね)

最近は割となんでも make に記述するようになってきましたが、その中でこれは使えるなと思った小ネタを紹介します。


タスクによっては何かをデプロイしたり削除したりすることがあるかと思います。

例えば以下のように serious-task というタスクが定義されているとします。

.PHONY: serious-task
serious-task:
	something-serious

このとき make serious-task を実行すると直接 something-serious が実行されてしまいますが、タスクの内容によっては間違って実行されないようになっていて欲しいことがあります。

なにかいい方法はないかと思って見つけたのが以下のQuestion。

これを参考に confirmation というタスクを以下のように定義しました。

.PHONY: confirmation
confirmation:
	@read -p "Are you serious? [y/N]: " ans && [ $${ans:-N} = y ] || (echo "You’re kidding me."; exit 1)

confirmationy という入力を受け取ったときのみ正常に終了します。

$ make confirmation
Are you serious? [y/N]: y

$ make confirmation
Are you serious? [y/N]: N
You’re kidding me.
make: *** [confirmation] Error 1

あとは confirmation を適宜実行するだけです

.PHONY: serious-task
serious-task:
	@$(MAKE) confirmation
	something-serious
$ make serious-task
Are you serious? [y/N]: y
something-serious

$ make serious-task
Are you serious? [y/N]: N
You’re kidding me.

これで明示的に y を入力した時のみ something-serious が実行されるようになりました。