Web RecordWEB Record
Tool

【タスクランナー】Go製のタスクランナー go-taskの導入方法と簡単な使い方

2024.06.17
【タスクランナー】Go製のタスクランナー go-taskの導入方法と簡単な使い方

ymlファイルベースのタスクランナーgo-taskが便利だったので、導入方法と簡単に使い方も紹介します。

概要

go-taskはタスクランナーツールです。

最大の特徴はそのシンプルさでしょう。公式でもGNU Makeよりもシンプルで使いやすいと謳っています。

ドキュメントはこちらです。

各タスクはTaskfile.ymlのymlファイルに記載していく形となります。

インストール

まずはインストール方法についてみていきましょう。

公式では非常に多くのインストール方法が提示されています。

この記事では、npm installを利用した方法を紹介します。

bash
1npm install @go-task/cli
2
3# バージョンの確認
4npx task --version
5
6Task version: v3.37.2

これでバージョン情報が確認できればOKです。

基本的な書き方

インストールが完了したところで、基本的な書き方をみていきましょう。

go-taskでは、Taskfile.ymlを設置し、その中に各タスクを書いていくことになります。

最初に、helloの文字列を出力するだけのシンプルなhelloタスクを追加してみます。

以下のようになります。

Taskfile.yml
1version: "3"
2
3tasks:
4  hello:
5    cmds:
6      - echo 'Hello'
7      - echo 'Go Task!'

基本的な書き方として、tasks:の配下に各タスクを記載します。

tasks直下にあるhelloがタスク名になります。これは任意の名前をつけることができます。

コマンドからタスクを実行する際はこのタスク名を指定することになります。

タスク名の配下にあるcmds以下が実行するコマンドになります。上記の例のように複数コマンドも指定できます。

タスクの実行

それでは実際にタスクを実行してみます。

コマンドはnpx task <実行したいタスク名>になります。

bash
1npx task hello
2
3task: [hello] echo 'Hello'
4Hello
5task: [hello] echo 'Go Task!'
6Go Task!

ちゃんと出力できました。

作業ディレクトリを指定する

taskを実行するときデフォルトで、実行するTaskfile.ymlがあるディレクトリが開始ディレクトリとなります。

コマンド実行時の初期ディレクトリを変更するにはTaskfile.ymlのタスク内でdirに作業ディレクトリを指定します。

Taskfile.yml
1version: "3"
2
3tasks:
4  hello:
5    dir: ここに作業ディレクトリを指定する。
6    cmds:
7      - pwd

環境変数の指定

Taskfile内では各タスクで使用する環境変数も指定できます。

指定方法はいくつかあります。

Taskfile内でグローバルに使用できる環境変数を指定する。

各タスクで使用する共通の環境変数をグローバルに指定できます。

トップレベルにenvを指定し、その中で環境変数を定義していきます。

下記では、ENV_1env1の値を、ENV_2env2の値を環境変数として設定しています。

各タスク内では、設定した環境変数を使用しています。

Taskfile.yml
1version: "3"
2
3# ここで環境変数を指定する
4env:
5  ENV_1: env1
6  ENV_2: env2
7
8tasks:
9  use:env1:
10    cmds:
11      - echo 'ENV_1を使用'
12      - echo $ENV_1
13
14  use:env2:
15    cmds:
16      - echo 'ENV_2を使用'
17      - echo $ENV_2
18

use:env1を実行してみます。

bash
1npx task use:env1
2
3task: [use:env1] echo 'ENV_1を使用'
4ENV_1を使用
5task: [use:env1] echo $ENV_1
6env1

ENV_1に設定したenv1が出力されているのがわかります。

次にuse:env2を実行してみます。

bash
1npx task use:env2
2task: [use:env2] echo 'ENV_2を使用'
3ENV_2を使用
4task: [use:env2] echo $ENV_2
5env2

こちらではENV_2に設定したenv2が出力されています。

各タスク内でのみ使用できる環境変数を指定する。

上記ではグローバルに環境変数を指定しましたが、各タスク内でも環境変数を指定できます。

やり方は、タスク内でenvを指定し、その中で環境変数を指定します。

下記の例では、use:env1のタスク内で環境変数としてENV_1を設定しています。

use:env2ではENV_2を指定しています。

Taskfile.yml
1version: "3"
2
3tasks:
4  use:env1:
5    # ここで環境変数を指定する
6    env:
7      ENV_1: env1
8    cmds:
9      - echo 'ENV_1を使用'
10      - echo $ENV_1
11      - echo 'ENV_2は使用できない'
12      - echo $ENV_2
13
14  use:env2:
15    # ここで環境変数を指定する
16    env:
17      ENV_2: env2
18    cmds:
19      - echo 'ENV_2を使用'
20      - echo $ENV_2

グローバル指定した環境変数と異なり、タスク内で設定した環境変数は別のタスクでは使用できません。

先ほどの例のuse:env1のタスクでは、use:env2内で設定したENV_2の環境変数を出力しようとしていますが、別タスク内で指定した環境変数なのでアクセスできず空文字として出力されます。

bash
1npx task use:env1
2
3task: [use:env1] echo 'ENV_1を使用'
4ENV_1を使用
5task: [use:env1] echo $ENV_1
6env1
7task: [use:env1] echo 'ENV_2は使用できない'
8ENV_2は使用できない
9task: [use:env1] echo $ENV_2

別ファイルから環境変数を読み込む

これまでは、Taskfile.yml内で直接環境変数を指定する方法を見てきました。

直接指定する以外にも、別ファイルから環境変数を読み込むこともできます。

dotenvで読み込むファイルを指定することで実現できます。

Taskfile.yml
1...
2
3dotenv: ['ここに読み込むファイルのパスを指定する']
4
5...

読み込むファイルは複数指定することもできます。

Taskfile.yml
1...
2
3dotenv: ['ファイル1', 'ファイル2']
4
5...

下記の例では、読み込むファイルに.envを指定しています。

.env
1INCLUDE_ENV="別ファイルから読み込んだ環境変数の値"
Taskfile.yml
1version: "3"
2
3# 別ファイルから環境変数を読み込む
4dotenv: ["./.env"]
5
6tasks:
7  use:include-env:
8    cmds:
9      - echo $INCLUDE_ENV

下記が実行結果で、.envで指定した環境変数の値が読み込めていることが確認できます。

bash
1use:include-env
2
3task: [use:include-env] echo $INCLUDE_ENV
4別ファイルから読み込んだ環境変数の値

Taskfile.yml内で直接環境変数を指定したときと同様に、各タスク内でdotenvを指定して別ファイルから環境変数を読み取ることもできます。

Taskfile.yml
1version: "3"
2
3tasks:
4  use:include-env:
5    # タスク内で別ファイルから環境変数を読み込む
6    dotenv: ["./.env"]
7    cmds:
8      - echo $INCLUDE_ENV

各タスクの説明文

作成したタスクは後でどういう処理をしているのかわかりやすいように、説明文のようなものをつけることができます。

タスク内にdescを指定することで実現できます。

Taskfile.yml
1tasks:
2  タスク名:
3    desc: タスクの概要を記載

npx task --list-allTaskfile.yml内にある全てのタスクを見ることができるのですが、

このときに、descに記載した概要も表示してくれるので、どのタスクがあるのかが一目瞭然で非常に便利です。

bash
1npx task --list-all
2                                                                                                                              ─╯
3task: Available tasks for this project:
4* dev:web:       開発環境のWEB環境を起動

タスクを並列実行する

各タスクを並列で実行することもできます。

そのためにまずは、並列で実行したいタスクを追加します。

この例では、以下の二つのタスクを並列実行したいとします。

  1. npm run dev:web
  2. npm run dev:firebase

1つ目はWEB環境を起動するコマンドで、

2つ目は、firebaseのエミュレーターを起動するコマンドと考えていただければOKです。

この二つの処理を並列で実行させたいので、まずは各タスクを追加します。

1. npm run dev:webdev:webというタスクとして、2. npm run dev:firebasedev:firebaseというタスクとして定義します。

Taskfile.yml
1version: "3"
2
3tasks:
4  dev:web:
5    desc: "開発環境のWEB環境を起動"
6    cmds:
7      - npm run dev:web
8  dev:firebase:
9    desc: "Firebaseのエミュレーターを起動する"
10    cmds:
11      - npm run dev:firebase

次にこの二つのタスクを並列実行させるタスクを追加します。

そのために、並列実行させるタスク内でdepsを指定します。

このdepsに先ほどの二つのタスクを指定することで並列実行ができます。

以下では、並列実行させるタスクをdevとしてます。

dev内のdepsに並列実行させるdev:webdev:firebaseを指定しています。

Taskfile.yml
1version: "3"
2
3tasks:
4  # 並列実行させるタスクを追加
5  dev:
6    desc: "開発環境を起動"
7    deps: [dev:firebase, dev:web]
8
9  dev:web:
10    desc: "開発環境のWEB環境を起動"
11    cmds:
12      - npm run dev:web
13  dev:firebase:
14    desc: "Firebaseのエミュレーターを起動する"
15    cmds:
16      - npm run dev:firebase

この状態で、npx task devを実行すれば、dev:webdev:firebaseが並列実行されます。

以上、GO製のタスクランナーであるgo-taskの紹介でした。