nikkie-ftnextの日記

イベントレポートや読書メモを発信

Python向けタスクランナーとして気になっていたtaskipy 素振りの記、Poetryのない環境でお試し

はじめに

やっちまったなァ! nikkieです。

気になっていたパッケージを触りました。
使い始めの素振りログを綴ります。

目次

その名はtaskipy

The complementary task runner for python.」(Python向けの補完的なタスクランナー)を謳うtaskipy!

ドキュメントの例を私の言葉で説明すると

  • python -m unittest tests/test_*.pyと毎回叩いているとする
  • 「それ、taskipyで簡単にできるよ!!」
  • testタスクを定義(詳細は後述)
  • task testまたはpoetry run task testだけ🙌

今回はPoetryなしの環境での使い出しをアウトプットです。

知ったきっかけ

存在を知ったのはdoccanoのソースコードを読み始めたとき。
taskというのが気になって1、「どうやらtaskipyらしいぞ」と頭の片隅に留まりました。
https://github.com/doccano/doccano/blob/v1.8.3/backend/pyproject.toml#L83

また、澁川さんが書かれたフューチャー技術ブログでもtaskipyを見かけ、「いつか触りたい」とウズウズしていました。

ツールの実行はまとめて行いたい、みたいなことがありますが、poetryにはツールランチャーの機能はないので、taskipyを入れます。

Poetryのない環境でtaskipyを使う

Using Taskipy Without Poetryを参照します。

but actually only requires a valid pyproject.toml file in your project's directory.

(Poetryはなくてもいいけど)pyproject.tomlだけ必要とのことです。
作っていきましょう。
最近、pyproject.tomlデビューを果たしたのでした2

taskipyインストール

pip install taskipy

インストールするとtaskコマンドが使えるようになります4

% task --list
no pyproject.toml file found in this directory or parent directories
% touch pyproject.toml
% task --list
no tasks found. add a [tool.taskipy.tasks] section to your pyproject.toml

タスクの定義 & 実行

pyproject.tomlに[tool.taskipy.tasks]セクションを定義していきましょう。

先の例の続きです。
python -m unittest tests/test_*.pyをtestタスクとして、pyproject.tomlに定義します。

[tool.taskipy.tasks]
test = "python -m unittest tests/test_*.py"

これだけでtask testが動きます。

% task --list
test python -m unittest tests/test_*.py
% task test
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

ディレクトリ配置はこうなっていました。

.
├── tests/
│   ├── __init__.py
│   └── test_example.py  # 1 == 1 というテストが1件ある
└── pyproject.toml

taskipyドキュメントより

Composing Tasks」(タスクの構成)を見ていきます。

複数タスクの組合せ

ソースコード(素振りではテストコードしかないですが)をblackでフォーマットするタスクも追加します

[tool.taskipy.tasks]
test = "python -m unittest tests/test_*.py"
+black = "black -l 79 tests"

blackでフォーマットしてからtest実行と、複数のタスクを組合せたタスクが作れます!

[tool.taskipy.tasks]
test = "python -m unittest tests/test_*.py"
black = "black -l 79 tests"
+dev = "task black && task test"
% task dev
All done! ✨ 🍰 ✨
2 files left unchanged.
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

シェルコマンドを&&でつないでいる5という理解です。

タスクの前または後に挿入(フック)

もう1つ、Pre Task HookPost Task Hookが提供されています!

命名規則は分かりやすく

  • awesomeタスクの前に実行したいタスクはpre_awesome
  • 後に実行したいタスクはpost_awesome

命名するだけ! 簡単です🙌

組合せる代わりに、testの前にblackでフォーマット、とタスクを構成すると

[tool.taskipy.tasks]
test = "python -m unittest tests/test_*.py"
black = "black -l 79 tests"
dev = "task black && task test"
+pre_test = "task black"
% task test
All done! ✨ 🍰 ✨
2 files left unchanged.
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

testの前にblack(pre_testタスク)が実行されていますね!

今回は見切れていないですが、変数も使えるみたいですよ〜

終わりに

Poetryのない環境でtaskipyを触り始めた素振りログでした。

思っていた以上に簡単に使えて好印象です!
小さいタスクを組合せたり、pre/postのフックで順番に流したり、これはいいですね〜。
また、pyproject.tomlができるので、スプラウトメソッド・スプラウトクラス6みたいにpyproject.tomlへの移行のができるのもいいな〜と思います。

使っていく中で新たな発見があったらまたアウトプットしようと思います〜

P.S. taskipy以外にもタスクランナーはありますよね

最近知ったのが「Poe the Poet」
ref: Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ
愛称を勝手につけるならぽえぽえですね。
こちらはPoetryが必須なのかな?

あとPoetryより前からあるんじゃないかと思うのがtox(タスクランナーと言っていいかは自信なし)。

自作パッケージのCI環境を整える中で、ちょっとだけ触りましたが、taskipyと比べると覚えることは多めです(役割が違うかもしれないので比較はあんまり意味がないかも)