观看:运行、更改、构建、重复
在这篇文章中,我们将介绍如何自动重新编译和执行代码,当你修改源文件时。这种技术可以很容易地应用于各种应用程序,从 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
终止。
更进一步
此解决方案可以适应在 Docker 容器中使用,因为 watchexec
与 Docker 的绑定挂载卷完美协作。
您可以让您的规范持续运行,只要您还监视 ./spec
文件。
您还可以监视 ./lib
文件,如果您希望在更新依赖项时重新启动应用程序,这取决于您喜欢的流程。
您甚至可以监视其他路径以执行其他特定操作。
您将如何将其适应您自己的项目?