我目前在OSX上使用终端和vim作为Flutter开发环境。一切都很顺利,但当我保存任何dart文件时,应用程序不会重新加载。有没有办法触发这种行为?目前我必须转到终端并按“r”才能看到我的更改。
我目前在OSX上使用终端和vim作为Flutter开发环境。一切都很顺利,但当我保存任何dart文件时,应用程序不会重新加载。有没有办法触发这种行为?目前我必须转到终端并按“r”才能看到我的更改。
抱歉打广告,但我写了一个非常简单的 插件 来处理这个问题。
它利用Flutter的 --pid-file
命令行标志来发送 SIGUSR1
信号。
通过将此添加到 autocmd
,您可以实现与我的两行插件相同的结果。
silent execute '!kill -SIGUSR1 "$(cat /tmp/flutter.pid)"'
使用--pid-file
标志启动Flutter。
SIGUSR1
来终止进程的方法,制作了一个vim插件hankchiutw/flutter-reload.vim。
使用此插件时,您无需使用--pid-file
标志。(感谢pgrep
:))
只需执行flutter run
,修改*.dart文件并查看重新加载即可。
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
子目录中,如果是,则进行热重启,否则进行热重载。我这样调用脚本:
while true
do
find lib/ -name '*.dart' | entr -d -p ./hotreloader.sh /_
done
/_
参数使得 entr
将文件名传递给被调用的程序。
vscode有这个功能。如果你不介意转到vscode,你就可以直接使用它。你还可以联系作者,看看他们有没有关于在vim中如何实现的建议,或者直接检查源代码。很可能vim也有一种机制来实现这个功能。