🗳️

Taskfileで環境管理

2024/08/09に公開1

はじめに

開発環境のREADMEにあるコンテナデプロイのコマンドをコピペで実行していて、同僚ともさすがにまずいだろという話になり、shellスクリプトで管理し始めたが、しっくりこなかった。

色々調べたところTaskfileに辿り着いた。調べた内容を整理するつもりでまとめていく。

書くこと

  • Taskfileの使い方とできること

書かないこと

  • Taskfileの詳細な導入方法
  • 関係するツールとの比較

💻my環境

言語・ライブラリなど バージョン
PC MacBook Pro M1 Pro
go-task/task v3.38.0

🗳️ Taskfileについて

概要

Go言語製のタスクランナーで、コマンドをyamlファイルに記述するため可読性が高いなどの特徴がある
公式の説明は以下

https://taskfile.dev/

Task is a task runner / build tool that aims to be simpler and easier to use than, for example, GNU Make.

Since it's written in Go, Task is just a single binary and has no other dependencies, which means you don't need to mess with any complicated install setups just to use a build tool.

(DeepL翻訳)
Taskはタスク・ランナー/ビルド・ツールで、例えばGNU Makeよりもシンプルで使いやすいことを目指している。 Goで書かれているため、Taskはバイナリ1つだけで、他に依存するものがない。つまり、ビルド・ツールを使うためだけに複雑なインストール設定をする必要がない。

インストール

公式を参照

https://taskfile.dev/installation/

🛠️ 使い方

Hello World

Taskfile.ymlを作成して以下のように記述

Taskfile.yml
version: '3'

tasks:
  hello:
    cmd: echo "hello world"

task helloとコマンドを実行

結果
zaspa: task_test/ % task hello
task: [hello] echo "hello world"
hello world

複数のコマンドを実行

cmdsと複数形で書いて、-でリストに繋いでいけば上から順番に実行してくれる

Taskfile.yml
version: '3'
tasks:
  hoge:
    cmds:
      - echo "hoge"
      - echo "fuga"

task hogeを実行
実行したコマンド情報が出てくる。今回はechoコマンドのため、実行結果も出力されている

結果
zaspa: task_test/ % task hoge
task: [hoge] echo "hoge"
hoge
task: [hoge] echo "fuga"
fuga

タスク一覧

各コマンドにdescキーに説明を追加する。
defaultコマンドにtask -lを入れておく。(もちろんdefaultコマンドじゃなくてもよい)
これが結構便利で、重宝している。

Taskfile.yml
tasks:
  default:
    desc: show commands
    cmds:
      - task -l

  hoge:
    desc: hoge hoge
    cmd: echo "hoge"

  fuga:
    desc: fuga fuga
    cmd: echo "fuga"

taskと実行するとTaskfile内にあるタスク一覧を表示できる

結果
zaspa: task_test/ % task
task: [default] task -l
task: Available tasks for this project:
* default:              show commands
* fuga:                 fuga fuga
* hoge:                 hoge hoge

複数ファイル

以下のフォルダ構成として考える

フォルダ構成
.
├── Taskfile.yml
├── backend
│   └── Taskfile.yml
└── frontend
    └── Taskfile.yml

それぞれのファイルは、以下に置いておく
includesというキーでサブフォルダのTaskfileを読み込むことができる

./Taskfile.yml
./Taskfile.yml
version: '3'

includes:
  frontend:
    taskfile: ./frontend/Taskfile.yml
    dir: ./frontend

  backend:
    taskfile: ./backend/Taskfile.yml
    dir: ./backend

tasks:
  default:
    desc: show commands
    cmds:
      - task -l --sort none

  start:
    desc: Start all environments
    cmds:
      - task: frontend:start
      - task: backend:start

  build:
    desc: build backend and frontend
    cmds:
      - task: frontend:build
      - task: backend:build
./backend/Taskfile.yml
./backend/Taskfile.yml
version: '3'

tasks:
  default:
    cmd: task -l

  start:
    desc: backend start
    cmds:
      - echo "docker compose up -d"

  build:
    desc: backend build
    cmds:
      - echo "npm run build"

./frontend/Taskfile.yml
./frontend/Taskfile.yml
version: '3'

tasks:
  default:
    cmd: task -l

  start:
    desc: frontend start
    cmds:
      - echo "npm run dev"

  build:
    desc: frontend build
    cmds:
      - echo "npm run build"

ルートでtask実行することで内部にどんなコマンドがあるか一覧でわかる

一覧取得
zaspa: task_test/ % task 
task: [default] task -l --sort none
task: Available tasks for this project:
* default:              show commands
* start:                Start all environments
* build:                build backend and frontend
* frontend:start:       frontend start
* frontend:build:       frontend build
* backend:start:        backend start
* backend:build:        backend build

ルートにそれぞれのサブフォルダのコマンドを実行するように記述しておけば、一括で実行できる

rootのコマンド実行
zaspa: task_test/ % task start
task: [frontend:start] echo "npm run dev"
npm run dev
task: [backend:start] echo "docker compose up -d"
docker compose up -d

ルートフォルダからサブフォルダの内容を個別に実行することもできる

サブフォルダのコマンド実行
zaspa: task_test/ % task frontend:build
task: [frontend:build] echo "npm run build"
npm run build

おわりに

  • 全体的にかなり使い勝手いいと思いました(複雑な使い方はしていないので、まだわかりませんが)
  • defaultコマンドでコマンド一覧と説明を出すようにしておけば、どんなコマンドがあるかの確認が捗る
  • 紹介してないが.envファイルを読み込めるなど、変数の扱いも比較的簡単
  • 紹介してないが、並列実行も簡単に書ける
  • yamlファイル読みやすい
  • 機能が多いのか、自分の理解が浅いのか、使いこなせてる感はない

Discussion