🐍
invokeを用いたpackage treeを考える
背景
invokeを使用したpython package treeの良い方法が見つからなかった
結論
shellscriptより汎用性をもたせつつ構造化したコードを作りたい、なら使っても良い
ただ凝ったpackage treeを作りたいのであれば、そもそもinvokeではなくpython cmdで実行できるようにしたほうが良い
invoke利用メリット
- pip packageを利用できるところ、それに合わせてシェルコマンドと融合的に書けるところ
- シェルコマンドの実行方法としてsubprocessもあるが、invokeの方がtask 管理として容易
- 例えばtask一覧の確認は
invoke --list
で確認できる
- 例えばtask一覧の確認は
invokeについて
- pyinvoke https://github.com/pyinvoke/invoke
タスクランナーツールの1つ
ローカルでシェルコマンドを実行するライブラリ
例えば以下のように記述することができる
from invoke import task
@task
def test(context):
# $USERを表示する
context.run("echo $USER")
invokeでのdirectory tree
全体
root/
project/
invoke_tasks/*.py
services/*.py
configs/*.py
env.py
tests/
invoke_tasks/test_*.py
services/test_*.py
configs/test_*.py
test_env.py
参照フロー
参照の流れは一方通行にする
invoke_tasks -> services -> configs -> env.py
詳細説明
invoke_tasks
機能ごとにinvoke taskを管理
services
servicesにはサービス単位でモジュールを作成する
環境情報はconfigsを参照するようにする
configs
servicesに必要なconfigを管理
env.py
test、staging、productionの列挙式で情報を記述する
所感
使用ツールがtemplateを用意していない場合でゼロベースからdirectory treeを設計するのは非常に難しい
ただ必要になるケースというのは意外に多いと思われる
思いつきで考えてしまうと後から拡張性だけでなく保守運用コストが大きくかかるので注意が必要
参照の方向
と 参照モジュールを明らかにすること
、 ディレクトリ名
、 ディレクトリの深さ
、 ファイル名
、 関数名
、 変数名
、 テストの実装しやすさ
を検討すると幾分か楽になる
「とりあえず作ってみる、実装をすすめる」のではなく「後から修正や手戻りが容易であるような設計をしてから実装する」ことが大切である
今回はinvokeでpython package treeの一例を示した
Discussion