🐍

invokeを用いたpackage treeを考える

2022/01/25に公開

背景

invokeを使用したpython package treeの良い方法が見つからなかった

結論

shellscriptより汎用性をもたせつつ構造化したコードを作りたい、なら使っても良い
ただ凝ったpackage treeを作りたいのであれば、そもそもinvokeではなくpython cmdで実行できるようにしたほうが良い

invoke利用メリット

  • pip packageを利用できるところ、それに合わせてシェルコマンドと融合的に書けるところ
  • シェルコマンドの実行方法としてsubprocessもあるが、invokeの方がtask 管理として容易
    • 例えばtask一覧の確認は invoke --list で確認できる

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