2017-02-23 71 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

相關問題