視聴:実行、変更、ビルド、繰り返し
この記事では、ソースファイルを変更したときに、コードを自動的に再コンパイルして実行する方法について説明します。この手法は、CLIアプリからフルWebサーバーまで、さまざまなアプリに簡単に適用できます。
要件
watchexec
がインストールされていること(インストール手順についてはgithubを確認してください)- shardsの
targets
を使用する
設定
次の内容で./dev/build-exec.sh
ファイルを作成します。これは、コードを再コンパイルして実行するスクリプトです。
#!/bin/bash
cd $(dirname $0)/..
shards build "$1" && exec ./bin/"$1" "${@:2}"
次の内容で./dev/watch.sh
ファイルを作成します。このスクリプトは、ソースファイルへの変更を監視し、変更があった場合にビルドを実行します。
#!/bin/bash
cd $(dirname $0)/..
watchexec -r -w src --signal SIGTERM -- ./dev/build-exec.sh "$@"
実行できるようにする
$ chmod +x ./dev/build-exec.sh ./dev/watch.sh
お楽しみください
アプリを$ crystal init app awesome_app
で作成した場合
awesome_app
という名前のターゲットがあるはずです
$ cat shard.yml
name: awesome_app
... stripped ...
targets:
awesome_app:
main: src/awesome_app.cr
次の操作で、アプリの実行と変更の監視を開始できます
$ ./dev/watch.sh awesome_app
引数を渡すこともできます
$ ./dev/watch.sh awesome_app first second
仕組み
build-exec.sh
ファイルは、ターゲットの出力場所を利用して、ビルドと実行を行うことができます。ただし、特別な方法で実行する必要があります。exec
を介して、現在のプロセスを新しいバージョンのプログラムで置き換えます。
build-exec.sh
は、最初の引数としてターゲットを、残りの引数からアプリケーションが受け取ることを期待する引数とともに呼び出されます。それが${@:2}
の役割です。
watch.sh
は、./src
ディレクトリを監視し、変更があった場合は、引数を保持したままbuild-exec.sh
が実行されます。
提案されたwatch.sh
のボーナスポイントは、SIGTERM
を介してアプリに終了を丁寧に要求することです。
次のレベルへ
このソリューションは、watchexec
がDockerのバインドマウントされたボリュームで問題なく動作するため、Dockerコンテナで使用するように適合させることができます。
./spec
ファイルも監視する限り、スペックを継続的に実行できます。
依存関係を更新するときにアプリを再起動する場合は、./lib
ファイルも監視できます。これは、優先するワークフロー次第です。
他の特定の操作を実行するために、他のパスを監視することもできます。
自分のプロジェクトにどのように適応させますか?