プログラミング
一般的なコーディングタスクのためのタスクランナーの使用
Use Task Runners for Common Coding Tasks (hamvocke.com)
要約
この記事では、異なるコードリポジトリ間での依存関係のインストール、ビルド、コードのリンティングやフォーマット、テスト実行といった共通のコーディングタスクを簡素化するために、タスクランナーを活用する方法を解説しています。bashスクリプト、make、just、miseといったツールを紹介し、これらのツールが開発者の作業効率をどのように向上させるかについて説明しています。
全文翻訳
日々のソフトウェア開発において、私は様々なコードリポジトリ間を頻繁に切り替えます。各リポジトリは異なる技術スタックで書かれている可能性がありますが、スタックに関わらず、すべてのリポジトリで実行する必要がある共通のタスクがあります。依存関係のインストール、ソースコードのビルド、コードのリンティング、フォーマット、テストの実行、データベースマイグレーションの実行、ステージング環境へのデプロイ、新しいバージョンの作成、依存サービスの起動などです。
各リポジトリで使用されている具体的なツールによって、コマンドラインから呼び出すための、いくつかの扱いにくい呪文を覚える必要がありました。フォーマットにはrust fmtか?依存関係の更新にはmix deps.updateか?ビルドは./gradlew buildか、それともまたmvnに戻ったのか?結局、yarnかnpmかpnpmか?npm run prettierに引数を渡す必要があるか?そして、データベースマイグレーションをゼロからすべて実行するための3ステップのコマンドは何だったか?これらを覚えたくありません。私は「コードをビルドして」「リンティングして」「フォーマットして」「マイグレーションを実行して」「依存関係をインストールして」と言いたいだけです。
私の生活を少しでも楽にするために、私はよく、どのリポジトリにいても共通のタスクを同じ方法で実行できるような便利なツールを作成します。これにより、毎日数十回行う作業にマッスルメモリを適用できるようになります。これを実現する方法はいくつかあります。昔ながらのbashスクリプトやmakeから、miseやjustのようなよりモダンなツールまであります。一部の人々はこれらのツールを「タスクランナー」と呼び始めているので、ここではその名前を使うことにします。これらの選択肢を一緒に見ていきましょう。
シンプルなbashスクリプト
簡単なシェルスクリプト(または選択したLLMに協力を依頼して)を書いて、コードを操作するために必要な一般的なコマンドをラップする小さなラッパーとして機能させることができます。以下に例を示します。この例では、node/npm/javascriptを使用していると仮定しています。そうでない場合は、自分で補完できるはずです。
#!/usr/bin/env bash
set -e
function usage {
# 使用法情報を表示
}
function install {
# 依存関係をインストール
npm run ci
}
function build {
# ビルドプロセスを開始
npm run build
}
function test {
# テストスイートを実行
# 複数のステップを1つのコマンドで実行することもできます、クールですよね?
npm run test:unit
npx run playwright
}
function format {
# 渡す必要がある引数を隠すのに役立ちます
npm run prettier --write
}
if [[ $# -lt 1 ]]; then
usage
exit 1
fi
TARGET=$1
case $TARGET in
"help" )
usage
;;
"install" )
install
;;
"build" )
build
;;
"test" )
test
;;
"format" )
format
;;
* )
fail "Unknown command '${TARGET}'"
usage
exit 1
;;
esac
このスクリプトを、リポジトリのルートディレクトリにある好きなファイル名で保存します。短くて覚えやすい名前を選んでください。何度も入力することになります(私はrunをよく使います)。ああ、そしてchmod +x runで実行可能にすることを忘れないでください。
このスクリプトがあれば、run build、run lint、run testのように、プロジェクトに必要な他のコマンドを追加して簡単に実行できます。シェルスクリプトを使用する利点は、多くの柔軟性があることです。より複雑なタスクを実行したり、一般的な落とし穴を防ぐための洗練された検証を簡単に追加したりできます。例えば、誰かが誤ってPRODデータベースを削除するのを避けたい場合などです。もしbashスクリプトが手に負えなくなったら、上記のスクリプトで概説されている個々の関数を、専用のシェルスクリプトに抽出することから始めることができます。一般的な慣習として、それらをリポジトリのbin/ディレクトリに保存しますが、それは本当にあなた次第です。Bashは、このような単純な自動化タスクには自然な選択肢です。ほとんどの開発者のマシン(およびCI/CDサーバー)で利用可能であり、非常に柔軟です。構文が少し奇妙でなければ、ですが。
Make
makeは、もう一つの古典的なツールです。1970年代から続くビルド自動化ツールとして時の試練に耐え、すでにほとんどすべての開発者のマシンにインストールされています。makeを少しだけ変形させて、単純なタスクランナーとして使用し、提供するより強力な機能のほとんどを無視することができます。makeは、現在のディレクトリにあるMakefileというファイルを探して、何をするべきかを判断します。Makefileは、実行できるさまざまなルールを定義するプレーンテキストファイルです。ルールは次のパターンに従います。
target: dependencies
システムコマンドの実行
ターゲットは、コマンドラインからルールをどのように呼び出すかを定義します。make testは、「test」という名前のルールを探し、定義されたコマンドを実行します。上記のbashスクリプトに匹敵する簡単なMakefileは次のようになります。
.PHONY: install build test format
install:
npm run ci
build:
npm run build
test:
npm run test:unit
npx run playwright
format:
npm run prettier --write
注意
makeはインデントにうるさいことに注意してください。コマンドはスペースではなくタブでインデントする必要があります。上記のコードスニペットをコピーしても、ファイルが正しくインデントされていない限り、機能しない場合があります。
このMakefileをプロジェクトのルートに置くと、コマンドラインからmake install、make test、make formatを実行して、定義したタスクを実行できます。
.PHONYターゲットとは?
Makefileの最初の行をよく見ると、.PHONY:で始まる行があります。
.PHONY: install build test format
この行は、3つのターゲットすべてをphonyターゲット、つまりファイルシステム上のファイルを作成または依存しないターゲットとして宣言しています。Stack Overflowのこの回答は、これが何であるかを非常によく説明しています。要するに、makeは通常、実行するターゲットの出力としてファイルを作成することを期待しています。これらのファイルが存在する場合、makeは何もしません。例として、上記のMakefileを考えてみましょう。Makefileの隣に「format」という名前のファイルがあり、formatターゲットをphonyターゲットとして宣言しなかった場合、make formatを実行すると、makeは何もせずに次のように主張します。
make: 'format' is up to date.
これは可能性は低いですが、誰かがformatという名前のファイルを作成する可能性はゼロではありません。そのようなことが起こったときに、ツールが壊れて長々とした調査に乗り出すのは避けたいです。そのため、念のためすべてのターゲットを.PHONYとして宣言しています。
タブ補完
makeを使用するもう一つの無料の特典は、一部のシェルが、標準で、または小さなユーティリティパッケージをインストールすることで、ターゲットのタブ補完を提供することです。zshとfishは、標準で(または最小限の設定で)makeのタブ補完をサポートしています。bashを使用している場合は、このパッケージをインストールすることで、makeだけでなく、タブ補完を取得できます。makeのタブ補完が有効になると、コマンドラインでmakeと入力し始め、タブキーを繰り返し押すことで、Makefileで定義された利用可能なターゲットを循環できます。 pretty cool, huh?
もっとあります
Makeは、単純なタスクランナー以上のものです。ファイルベースのビルドツールとして最も一般的に使用されています。ターゲット間の依存関係を設定したり、関数や変数を宣言したり、さらに多くのことができます。もしそれが必要なら、maketutorial.comはあなたにとって素晴らしいリソースです。
Just
justは、この分野の比較的新しい参加者です。Makeから多くのインスピレーションを得ていますが、タスクランナーに役立ついくつかの便利な機能を追加し、Makeの奇妙な部分(phonyターゲットを宣言する必要があるなど)を削除しています。Makeを知っていれば、justは非常に馴染み深く感じるでしょう。リポジトリのルートにjustfileを保存すれば準備完了です。
install:
npm run ci
build:
npm run build
test:
npm run test:unit
npx run playwright
format:
npm run prettier --write
小さな欠点は、justが(bashやmakeとは異なり)開発者のマシンにすぐに利用できるわけではないことです。幸いなことに、多くのパッケージマネージャーで利用できるため、インストールは非常に簡単です。さらに深く掘り下げたい場合は、公式マニュアルが役立ちます。
Mise
この分野のもう一つの候補はmiseです。近年、miseは開発者のスイスアーミーナイフへと成長しました。執筆時点では、パッケージをインストールできるツールです。