リモートインクルード機能を使った、より再利用性の高いTaskfile
タスクランナーにもっぱらTask (以下、go-task) [1] を使用しています。
以前にもこのような記事を書いていました。
ライブラリを出すたびにSphinxを使ったドキュメントもきちんと用意はするようにしているのですが、毎回Taskfileをコピペするのにもちょっとした不便な点があります。
- あるリポジトリでやっていたことを別のリポジトリでも行いたいときに、コピペし直す必要がある。
- ライブラリの数が多いと、それだけで面倒くさい。
というわけで、あれこれ工夫して「再利用性の高いTaskfile環境」を作ってみました。
⚠重要⚠
この記事では、go-taskの実験的な機能を紹介しています。 [2]
そのため、記事を読んだ時点で「正式採用されて不要になった工程がある」「最終的に頓挫してなかったことになる」という状況になっている可能性があります。
include
機能
go-taskのgo-taskには、他のTaskfileをインクルードしてタスクの統合処理が可能です。
include:
docs:
taskfile: './Taskfile.docs.yaml'
tasks:
build:
desc: 'Display help of docs'
deps:
- '{{.run_python}} sphinx-build ...'
同じフォルダ上にTaskfile.yaml
とTaskfile.docs.yaml
があったときに、上記のようにTaskfile.yaml
側でinclude
としてインクルードできます。
この場合、Taskfile.docs.yaml
で定義されていたbuild
というタスクは、docs:build
という形式で呼び出すことが可能になります。
tasiflie
の項目はフォルダを指定することも可能で、この場合は{指定したフォルダ}/Taskfile.ya?ml
を
インクルードされる方のTaskfileが変数を使用している場合も、vars
に指定することで問題なく対応可能です。
include:
docs:
taskfile: './Taskfile.docs.yaml'
vars:
run_python: 'uv run'
まず、ローカルの相対パスでのインクルードが標準対応していることを覚えておきましょう。
自分のプロダクトでも、多くのケースで使用しています。
このインクルード機能ですが、【実験的】ではあるものの実はリモートのファイルもインクルードできます。
事前作業: 実験的要素の有効化を行う
この先で【実験的な機能】を使う方法を簡単に解説します。
上記のドキュメントにも書かれていますが、各機能を有効にするためには次のいずれかが必要です。
-
.taskrc.yml
を用意して、experiments.{機能名}
の値に1
を設定する。 - あらかじめ環境変数
TASK_X_{機能名}
の値に1
を設定する。 -
.env
を用意して、TASK_X_{機能名}=1
を記述しておく。
気をつける必要がある点として、「Taskfile.yaml
にexperiments.{機能名}
を設定するのではない」 ということです。
大人しく上記のいずれかを選択しましょう。個人的には.env
が程よいと思っています。
なお、今回必要な{機能名}
はREMOTE_TASKFILES
です。
TASK_X_REMOTE_TASKFILES=1
GitHubのファイルを指定してインクルードを行う
REMOTE_TASKFILES
を有効にすると、include
セクションのtaskfile
に次の形式も設定可能になります。
- HTTP/HTTPSでのファイル実体URL
- "Git over HTTP"でのリモートリポジトリ上のファイル指定
- "Git over SSH"でのリモートリポジトリ上のファイル指定
"Git over XXX"形式でもブランチやタグを指定可能です。
GitHubでホスティングしているものを指定する場合、どの形式も利用可能ではあるので、好みで選択してください。
# Git over HTTPを使ってブランチも指定した例
includes:
docs:
taskfile: 'https://github.com/attakei/workspace-configs.git//projects/sphinx-doc/Taskfile.yaml?tag=v0.2.0'
"Git over XXX"の記述はちょっと慣れが必要ですが、{GitHubのWeb画面で出るclone用URL}//{ファイルパス}
となっています。
リポジトリURLとファイルパスの間が//
となっている点がポイントです。
この形式のinclude
を使用した状態でtask
コマンドからタスクを実行すると、「リモートファイルをインクルードをする」ための警告が出ます。
プロンプトはy/N
形式で何も入れずにEnterをするとNo
扱いになります。ちゃんとy
を入力してからEnterしましょう。
CI/CD環境下での注意点
前述の通り、リモートファイルをインクルードした状態でタスクを実行しようとするとプロンプトが出てしまします。
これでは、CI/CDワークフロー環境で実行しようとすると動作が途中で止まってしまいます。
この対策として、go-taskにはプロンプトを全部y
にするための--yes
引数があります。
GitHub Actionsのワークフロー内でgo-taskを使ったテストなどをしている場合は、忘れずに指定しましょう。
リポジトリの状況に追従する
この機能を使うことで、別の共通化した設定を管理するリポジトリからTaskfileを参照できました。
では、適切に追従するためにはどうすればよいでしょうか。
一応、URLでのブランチ指定でmain
のようなデフォルトブランチを設定して、task --download
のように--download
オプションを指定することで都度最新ファイルを確認してくれるみたいです。
しかし、これだと変更が無いと分かりきっているのにダウンロードが頻発するため、あまり良くありません。
現在自分が取っている戦略は「共通化した設定を管理するリポジトリで適宜タグを設定しつつ、Renovateを使って追従する」というものです。
この戦略の地味なメリットとして「Renovateが更新をいい感じに追ってくれるためPRが溢れたりはしない」というポイントがあったりします。
しかし、Renovateが標準提供している項目の中にgo-taskはないため、ちょっとした工夫が必要になります。
少し長くなるので今回は省略していますが、下記のファイルなどを見るとなんとなく想像できるかもしれません。
(後ほどこれについては別途記事を書く予定です)
ちなみに、この手法自体も再利用可能になるように気をつけて実装したので、興味があって理解できそうなら手を出してみてください。
Discussion