Taskfileで環境管理
はじめに
開発環境のREADMEにあるコンテナデプロイのコマンドをコピペで実行していて、同僚ともさすがにまずいだろという話になり、shellスクリプトで管理し始めたが、しっくりこなかった。
色々調べたところTaskfileに辿り着いた。調べた内容を整理するつもりでまとめていく。
書くこと
- Taskfileの使い方とできること
書かないこと
- Taskfileの詳細な導入方法
- 関係するツールとの比較
💻my環境
言語・ライブラリなど | バージョン |
---|---|
PC | MacBook Pro M1 Pro |
go-task/task | v3.38.0 |
🗳️ Taskfileについて
概要
Go言語製のタスクランナーで、コマンドをyamlファイルに記述するため可読性が高いなどの特徴がある
公式の説明は以下
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つだけで、他に依存するものがない。つまり、ビルド・ツールを使うためだけに複雑なインストール設定をする必要がない。
インストール
公式を参照
🛠️ 使い方
Hello World
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
と複数形で書いて、-
でリストに繋いでいけば上から順番に実行してくれる
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
コマンドじゃなくてもよい)
これが結構便利で、重宝している。
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
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
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
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
ルートにそれぞれのサブフォルダのコマンドを実行するように記述しておけば、一括で実行できる
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
参考程度に。