跳至内容
GitHub 仓库 论坛 RSS 新闻提要

观看:运行、更改、构建、重复

Brian J. Cardiff

在这篇文章中,我们将介绍如何自动重新编译和执行代码,当你修改源文件时。这种技术可以很容易地应用于各种应用程序,从 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 文件,如果您希望在更新依赖项时重新启动应用程序,这取决于您喜欢的流程。

您甚至可以监视其他路径以执行其他特定操作。

您将如何将其适应您自己的项目?