コンテンツへスキップ
GitHubリポジトリ フォーラム RSSニュースフィード

視聴:実行、変更、ビルド、繰り返し

ブライアン・J・カーディフ

この記事では、ソースファイルを変更したときに、コードを自動的に再コンパイルして実行する方法について説明します。この手法は、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ファイルも監視できます。これは、優先するワークフロー次第です。

他の特定の操作を実行するために、他のパスを監視することもできます。

自分のプロジェクトにどのように適応させますか?