2017-02-23 89 views
2

我有写在我的$ GOPATH中的API代码,但主文件位于系统的其他位置。我试图让我的主文件退出,并启动,并再次保存某些文件。我已经得到的最接近的是通过使用findentr组合:在文件上重新启动golang服务器的最佳方式

find $GOPATH/github.com/example/example -path $GOPATH/example/example/vendor -prune -o -name '*.go' -print | entr -r go run /vagrant/script/api/main.go

但由于某些原因entr无法再次启动导致错误消息之前下关闭服务:

ListenAndServe: listen tcp 127.0.0.1:1456: bind: address already in use

对于允许实时重新加载go服务器的任何解决方案都是开放的,但配置/设置要求越少越好,因为我希望在多个项目中重用该解决方案。

不知道这是一个问题,但我也应该注意到,我使用vagrant-fsnotify保存在主机上时,可以触摸我的Vagrant来宾机器中已更改的文件。

+0

我的第一个怀疑是'entr'只会杀死'go run'进程,让你的Go程序仍在运行。但是'entr'文档说,从3.1开始,它“确保所有的子进程接收到一个信号”,目前的版本是3.6。你编译的Go程序应该是'go run'的子进程,所以如果你正在使用'entr'的最新版本,我猜可能不是这样。 (您是否使用最新的'entr'?) –

+0

@DarshanRivka稍微我今天用apt-get install安装了它。我猜这个程序没有--version选项,所以我不知道我使用的是哪个版本。 – tanman

+0

Scratch,它看起来像Ubuntu 14(我正在使用)它只在版本2.5。我会尝试手动安装最新版本,看看是否可以解决问题。 – tanman

回答

0

根据评论,您正在使用旧版本的entr,它仅在杀死go run进程,让您的Go程序仍在运行。运行版本3.1或更高版本的entr也会将终止信号发送到您的Go可执行文件,这可以解决问题。

如果有可能,请将entr升级到当前版本(3.6)或至少3.1+。如果这是不可能的,一种解决方案是编写一个封装程序来处理终止信号。该程序将运行go run并观察终止信号。收到这个信号后,你的包装会杀死go run和你的Go程序。

+1

是的新版本修复了这个问题。谢谢 – tanman

相关问题