信息:我是一名 Emacs 用户,曾经使用 React-Native 开发移动应用程序。
最近在尝试开发一个flutter应用程序,卡在
hot-reload
部分,希望当我更改lib/*dart
时flutter能够自动重新加载。
我正在考虑的是观察
lib/*dart
的修改,当它发生时,自动将 r
传递给 flutter 进程。
如何才能到达
flutter run
流程?
Emacs 解决方案
一遍又一遍地阅读保存时热重载后,我更新了我的 Emacs 的配置文件:
(require 'dart-mode)
(defun auto-reload ()
(shell-command "kill -s SIGUSR1 $(cat /tmp/flutter.pid) && echo 'reload flutter...'"))
(add-hook 'dart-mode-hook
(lambda ()
(add-hook 'after-save-hook 'auto-reload nil 'make-it-local)))
这非常简单,我简直不敢相信......杀死
flutter run
进程,通过我们的 shell 脚本向 kill -SIGUSR1
进程发送信号 flutter run
后,它将自动重新加载。
谢谢@pskink,我绞尽脑汁再试了一下,问题就解决了。
我再次查看了关于linux signal
的
描述,
kill
命令描述为:
向指定进程、指定进程组的所有成员或系统上的所有进程发送信号。
不仅仅是粗鲁地杀死进程......这是命令行中
kill
的描述:
kill [-s sigspec | -n signum | -sigspec] pid | jobspec
...or
kill -l [sigspec]
然而,
flutter的flag
--pid-file
是这样描述的:
指定一个文件来写入进程ID。您可以发送 SIGUSR1 来触发热重载,发送 SIGUSR2 来触发热重启。
我们
kill -SIGUSR1 $(cat /tmp/flutter.pid)
,当我们向SIGURS1
发送信号flutter process
时,这就是发生的事情。
我仍然想知道,我们是否可以将
r
发送到 flutter run
进程的“屏幕”?
https://pub.dartlang.org/packages/angel_hot 和 https://pub.dartlang.org/packages/jaguar_hotreload 是服务器端开发的热重载支持包 - 热重载文件更改。
我希望这也适用于 Flutter。
您还可以调查源代码并创建自定义实现。
该功能由 Dart 观测站提供,这是一项内置于虚拟机中的服务,您可以连接到该服务并可以通过命令进行控制。
另请参阅https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md
如果您使用 lsp-mode 和 lsp-dart - 您可以附加一个保存钩子,该钩子在正在运行的 flutter 调试服务实例上执行热重载。
(use-package lsp-mode)
(add-hook 'dart-mode-hook #'lsp-deferred)
(defun lsp-dart-install-save-hooks ()
(add-hook 'after-save-hook #'flutter-hot-reload t t))
(add-hook 'dart-mode-hook #'lsp-dart-install-save-hooks)
实例需要运行才能使其工作。要启动实例,请使用
flutter-run <RET>
或 flutter-run-device <RET> [select device] <RET>
。