我知道 AppEngine 会这样做,但我不会为它编写代码。
我尝试使用Guard
Ruby 世界来监听.go
文件的变化,并执行以下命令:
killall foo
go build -race
./foo &
但它从不发送foo
到后台,它只是无限期地挂起。
你们是如何解决这个问题的?解决方案也必须是跨平台的(GNU/Linux 和 Mac)。
一位朋友为 go 编写了一个简单的编译守护程序,对我自己的小型 net/http-projects 工作就像一个魅力。
你可以在这里找到存储库:https ://github.com/githubnemo/CompileDaemon
另一种选择,如果您的机器上安装了 nodejs
使用 -g安装nodemonnpm i -g nodemon
转到您的代码目录并运行:
nodemon --watch './**/*.go' --signal SIGTERM --exec 'go' run cmd/MyProgram/main.go
这将在每次任何.go
文件更改时发送 SIGTERM 并将运行go run cmd/Myprogram/main.go
完全跨平台。
You can also try out Gin by Codegangsta. It's fire and forget.
https://github.com/codegangsta/gin
EDIT: I prefer CompileDaemon nowadays. Gin sometimes won't accept requests
我最近发现了一个反射工具。它速度很快,就像一个魅力。它与 nodemon(来自 nodejs 世界)和 guard(来自 ruby 世界)非常相似。
大多数时候我使用它类似于下面:
reflex -d none -s -R vendor. -r \.go$ -- go run cmd/server/main.go
但是将它的选项放在像 .reflex 这样的文件中可能更方便,其内容如下:
-d none -s -R vendor. -r \.go$
那么你就这样运行它
reflex $(cat .reflex) -- go run cmd/server/main.go
你可以对“热重载”测试做同样的事情:
reflex $(cat .reflex) -- go test ./... -v
还有一个配置选项,您可以在其中指定同时运行的许多命令,但我并没有真正使用它。
你可以用nodemon
这个。只需创建一个 nodemon.json 文件,其中包含您的配置、要监视的文件、要忽略的文件以及文件更改时要执行的命令。像这样的配置。
nodemon.json
{
"watch": ["*"],
"ext": "go graphql",
"ignore": ["*gen*.go"],
"exec": "go run scripts/gqlgen.go && (killall -9 server || true ) && go run ./server/server.go"
}
你确实需要 nodejs 才能工作。
但它比我迄今为止使用的任何其他特定工具都要好得多。
我使用了一个名为entr的工具
安装brew install entr
(mac)
或sudo apt-get install entr
(linux)
要重新编译并运行.go
文件更改,请运行以下命令...
ls **/*.go | entr go run main.go
有一个 go 版本的 nodemon:https ://github.com/mitranim/gow
go install github.com/mitranim/gow@latest
用法
# Start and restart on change
gow run .
# Pass args to the program
gow run . arg0 arg1 ...
# Run subdirectory
gow run ./subdir
# Vet and re-vet on change; verbose mode is recommended
gow -v vet
# Clear terminal on restart
gow -c run .
# Specify file extension to watch
gow -e=go,mod,html run .
# Help
gow -h
GO 世界有 2 个主要竞争者fresh
&glide
但我会选择Fresh
https://github.com/gravityblast/fresh
在互联网上滚动搜索使用标准 linux 工具(inotify 和 bash)的简单解决方案后,我最终创建了这个简单的 bash 脚本来完成这项工作。
我在运行 golang:1.12 并go run .
用于提供文件的容器中对其进行了测试。在使用它之前阅读脚本,因为它会go run
根据文件夹名称杀死进程,如果与您运行的其他进程发生冲突,它可能会杀死它们。
#!/bin/bash
go run . &
while inotifywait --exclude .swp -e modify -r . ;
do
# find PID of the file generated by `go run .` to kill it. make sure the grep does not match other processes running on the system
IDS=$(ps ax | grep "/tmp/go-build" | grep "b001/exe/main" | grep -v "grep" | awk '{print $1}')
if [ ! -z "$IDS" ]
then
kill $IDS;
fi
go run . &
done;
最好的选择是在你的机器上安装nodejs并使用nodemon
包
使用 -g安装nodemonsudo npm install -g nodemon
也使用 sudo 来避免任何写权限
现在转到您的程序目录并运行:
nodemon --watch './**/*.go' --signal SIGTERM --exec 'go' run path-to-the-main-file-of-go-program-with-extension
这将在每次任何.go
文件更改时发送 SIGTERM 并将运行go run main-go-file-of-program-with-extension
完全跨平台。这将适用于任何编程语言,只需将命令更改为
nodemon --watch './**/*.extension-of-programming-file-without-preceeding-dot' --signal SIGTERM --exec 'go' run path-to-the-main-file-of-program-with-extension
如果有人仍在寻找解决方案,我编写了一些 shell 脚本来执行此操作,它可以通过 docker 环境使用,https://github.com/zephinzer/golang-dev上的 repos