Taskfile使ってみた

に公開

仕事でチームメンバーがTaskfileというものがあるということを共有していて、どんなものか知らなかったので、今回は入門してみようと思います。

Taskfileとは?

公式ドキュメントによると、TaskfileとはGNU Makeなどと比較してシンプルであり使いやすさを求めたタスクランナーおよびビルドツールということです。Goで書かれているためバイナリとして利用でき、インストールに他の依存するソフトなどを入れることなく使えることがいいということです。

また、特徴として以下があるようです。

  • 上述のようにバイナリをダウンロードするだけでよく、$PATHに追加するだけでいいのでインストールがとても簡単
  • シンプルなコマンドを追加するだけでCIパイプラインに組み込むことができる
  • 一般的なツールはLinuxやmacOSなどOS依存があるのに比較し、Taskfileはクロスプラットフォームで利用でき、Windowsも対応している
  • ファイルの変更がないなどの条件を取得してタスクの実行の制御などができる

その他の情報については、ぜひ公式ドキュメントを参照ください。

https://taskfile.dev/

実際に使ってみる

インストール

私はmacbookを利用しているのでhomebrew経由でインストールしました。

brew install go-task/tap/go-task

このほかにもsnapをはじめnpmpipそしてwingetなどでインストールできるようなので、ご利用の環境に合わせてインストール方法を選んでください。

Taskfileの作成

それではコマンドを利用してTaskfile実行環境を構築していきましょう。

Taskがインストールされると、Taskfileは以下のコマンドで生成できます。

task --init

実行するとTaskfile.ymlが実行場所に生成されます。実行パスのサブディレクトリに生成したい場合は以下のように指定することで対応できます。

task --init ./subdirectory

また、名前を指定する場合は以下のようにファイル名を指定します。

task --init Specified.yml

生成されたTaskfile.ymlは以下のようになっておりました。

# https://taskfile.dev

version: '3'

vars:
  GREETING: Hello, World!

tasks:
  default:
    cmds:
      - echo "{{.GREETING}}"
    silent: true

パッとみた限り、defaultというタスクが定義されており、GREETINGに指定されたHello, World!を表示するコマンドが実行されるということが予想されます。それでは実際に実行してみましょう。defaultタスクを実行するには以下のコマンドを利用します。

task default

実行結果は予想通り、画面にHello, World!と表示されました。なお、silentオプションをつけていなかった場合、実行したコマンドが先に表示され、以下のような表示になります。

task: [default] echo "Hello, World!"
Hello, World!

uvを利用してPython環境を構築してみる

次にuvを利用してPython環境を構築するためのタスクを定義してみようと思います。

まず、タスクファイルを書いてみます。

# https://taskfile.dev

version: '3'

tasks:
  sync:
    cmds:
      - uv sync

  execute:
    deps: [sync]
    cmds:
      - uv run main.py

内容としては以下の実装をしました。

  • uvで環境を構築するsyncタスクとコードを実行するexecuteタスクを実装
  • executeタスクを実行するためには必ずsyncタスクが先に実行されるように実装

ではまずsyncタスクだけ実行してみます。

task sync

# 以下出力
task: [sync] uv sync
Resolved 1 package in 0.37ms
Audited in 0.00ms

次にexecuteタスクを実行してみます。

task execute

# 以下出力
task: [sync] uv sync
Using CPython 3.12.9
Creating virtual environment at: .venv
Resolved 1 package in 15ms
Audited in 0.23ms
task: [execute] uv run main.py
Hello from taskfile!

結果を見ると、指定したのはexecuteタスクだけですが、その前にsyncタスクを実行させるように指示していたため、実行されていることがわかります。

Makefileと比較して

Makefileと比較して個人的に思ったことをまとめてみます。

  • メリット
    • YAML形式で書けるので、Makefileと比較して記述が容易である
    • あくまで個人的意見ではあるがMakefileの記述方法と比較して書きやすい
  • デメリット
    • makeコマンドはデフォルトで入っている環境が多いので、インストールする手間がないが、taskコマンドはデフォルトでは入ってないのでインストールが必要

まとめ

今回は簡単ではありますがTaskfileを使ってみました。今まではMakefileを使っていましたが、Taskfileの方が個人的には書きやすい気がするので、今後はTaskfileを使っていこうと思います。

Discussion