Be an Engineer.

社会人からWEBエンジニアになった人間の備忘録的勉強記録

ファイル保存毎にコマンドの自動実行ができる modd が便利

modd、あまり多くその存在を聞くことがなかったのですがとても便利なツールだったので、個人的なまとめの意味も込めて紹介します。

moddとは

github.com

moddとは ファイル変更を検知して何かしらのコマンドを実行するためのツール です。 例えば、

  • コードを変更したら都度テストを実行させたい
  • Webアプリケーションのコードを書いているときに、変更を追加したのでサーバを再起動する(livereload)

これらの操作をmoddを使うことによって自動的に行うことができるようになります。

利用例のイメージ

参考までにイメージしやすくなるかもしれないので、moddを利用している時の動きを以下に載せます。

https://raw.githubusercontent.com/shirakiya/modd-sample/main/docs/sample.gif

このサンプルは以下のリポジトリに置いています。

github.com

インストール

moddの README に書かれています。要点をかい摘むと、

  1. go get
  2. Homebrew(macOS
  3. 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も多いですが、開発するものはその限りではなく適用できる場面が意外にありとても重宝しているので、作者の方には本当に感謝です。