跳到內容
GitHub 儲存庫 論壇 RSS 新聞訂閱

觀看:執行、變更、建置、重複

Brian J. Cardiff

在這篇文章中,我們將介紹如何在您修改原始碼檔案時自動重新編譯並執行您的程式碼。此技術可以輕鬆應用於從 CLI 應用程式到完整網路伺服器的各種應用程式。

需求

  • 已安裝 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 檔案,這取決於您偏好的工作流程。

您甚至可以監看其他路徑來執行其他特定動作。

您會如何調整它以適應您自己的專案?