我使用名为 entr 的出色小工具完成了此操作。在 OS/X 上,您可以从 brew: brew install entr 安装它。该工具的主页在http://eradman.com/entrproject/
然后你用@nobody_nowhere建议的pidfile开始flutter run。
您如何运行entr 取决于服务水平。在最简单的情况下,您只需执行find lib/ -name '*.dart' | entr -p kill -USR1 $(cat /tmp/flutter.pid)
但是这样的调用不会检测到源树中的新文件(因为find 会在开始时构建一个只查看一次的文件列表)。您可以使用稍微复杂一点的单线:
while true
do
find lib/ -name '*.dart' | \
entr -d -p kill -USR1 $(cat /tmp/flutter.pid)
done
-d 选项使entr 在其中一个目录中检测到新文件并且循环再次运行时退出。
我个人使用更复杂的方法。我使用 Redux 并更改到中间件或其他状态文件不适用于热重载,它不会接受这些更改。所以你需要求助于热重启。
我有一个脚本hotrestarter.sh:
#!/bin/bash
set -euo pipefail
PIDFILE="/tmp/flutter.pid"
if [[ "${1-}" != "" && -e $PIDFILE ]]; then
if [[ "$1" =~ \/state\/ ]]; then
kill -USR2 $(cat $PIDFILE)
else
kill -USR1 $(cat $PIDFILE)
fi
fi
它检查修改后的文件是否位于/state 子目录中,如果为 true,则热重启或热重载。我这样称呼脚本:
while true
do
find lib/ -name '*.dart' | entr -d -p ./hotreloader.sh /_
done
/_ 参数使entr 将文件名传递给被调用的程序。