ファイル保存毎にコマンドの自動実行ができる modd が便利
modd、あまり多くその存在を聞くことがなかったのですがとても便利なツールだったので、個人的なまとめの意味も込めて紹介します。
moddとは
moddとは ファイル変更を検知して何かしらのコマンドを実行するためのツール です。 例えば、
- コードを変更したら都度テストを実行させたい
- Webアプリケーションのコードを書いているときに、変更を追加したのでサーバを再起動する(livereload)
これらの操作をmoddを使うことによって自動的に行うことができるようになります。
利用例のイメージ
参考までにイメージしやすくなるかもしれないので、moddを利用している時の動きを以下に載せます。
このサンプルは以下のリポジトリに置いています。
インストール
moddの README に書かれています。要点をかい摘むと、
- go get
- Homebrew(macOS)
- releaseパッケージをダウンロード
の3つの方法でmoddを取得することができます。modd自体はGoで書かれているため利用者側も楽で良いですね。
Dockerコンテナで使ってみる
例えば以下のようなDockerfileでビルドするとmoddが使えるイメージを用意できます。
これは主に開発向けのイメージを作ることを意識したDockerfileであり、これはあくまで一つの例であることはご留意ください。
# moddコマンドだけ欲しい状況なので、 # tgzからmoddを取り出すことができるようなstepを入れておくとgoodか FROM alpine:3.12.3 as builder WORKDIR /opt ADD https://github.com/cortesi/modd/releases/download/v0.8/modd-0.8-linux64.tgz . RUN tar xvf modd-0.8-linux64.tgz # goが入っていないイメージの例としてpythonイメージを利用している FROM python:3.9.1 COPY --from=builder /opt/modd-0.8-linux64/modd /usr/local/bin/ # 他の準備... CMD ["modd"]
設定してみる
使うには「どのファイルを検出対象として、どのコマンドを実行するか」の設定をする必要があり、modd.conf
ファイルに書きます。( modd.conf
はmoddで決められた設定ファイル名のデフォルトであり、modd実行時に --file={file}
と指定することで任意のファイル名にすることができます。)
以下にいくつか例を挙げます。しっかり README に書いてくださっているので、詳細についてはそちらを見てみるのがよいです。
ファイル変更を検知してコマンドを実行したい時
*.py { prep: python -m unittest }
この例であれば、*.py に該当するファイルが保存されると python -m unittest
が実行されます。
コマンドをlivereloadしたい時
*.py { prep: python -m unittest daemon: python main.py }
この例であれば、*.py に該当するファイルが保存されると、その都度 python -m unittest
が実行された後に、moddプロセスが管理している子プロセス python [main.py](http://main.py)
にSIGHUPシグナルが発行され、再起動します。
※ この設定を使っているのが上記のGIFのものとなります。
起動時に一度だけあるコマンドを実行したい時
{ prep: echo hello }
この例であれば、 modd
の起動時に一度だけ echo hello
が実行されます。
このツールの作者でもコントリビュータでもないですが、非常に便利だったので紹介しました。livereloadが実装されたWeb Application Frameworkも多いですが、開発するものはその限りではなく適用できる場面が意外にありとても重宝しているので、作者の方には本当に感謝です。