Go 在文件更改时自动重新编译并重新加载服务器
我知道AppEngine会这么做,但我不是在为它编码 我尝试使用Ruby world中的Go 在文件更改时自动重新编译并重新加载服务器,go,guard,Go,Guard,我知道AppEngine会这么做,但我不是在为它编码 我尝试使用Ruby world中的Guard来监听文件上的更改,然后执行以下命令: killall foo go build -race ./foo & 但它从不将foo发送到后台,它只是无限期地挂起 你们是怎么解决这个问题的?解决方案也必须是跨平台的(GNU/Linux和Mac)。一位朋友为go编写了一个简单的编译守护程序,它对我自己的小型net/http项目来说非常有用 您可以在这里找到存储库:您也可以尝试使用Codegangs
Guard
来监听文件上的更改,然后执行以下命令:
killall foo
go build -race
./foo &
但它从不将foo
发送到后台,它只是无限期地挂起
你们是怎么解决这个问题的?解决方案也必须是跨平台的(GNU/Linux和Mac)。一位朋友为go编写了一个简单的编译守护程序,它对我自己的小型net/http项目来说非常有用
您可以在这里找到存储库:您也可以尝试使用Codegangsta的Gin。这是火和忘记
编辑:
我更喜欢现在。Gin有时不接受请求我最近发现了一个工具。它速度快,效果很好。它与nodemon(来自nodejs世界)和guard(来自ruby世界)非常相似
大多数情况下,我使用它的方式与以下类似:
reflection-d none-s-R供应商-r\.go$--运行cmd/server/main.go
但将其选项放在.reflect这样的文件中可能更方便,其内容如下:
-d无-s-R供应商-r\.go$
那么你就这样运行它
reflection$(cat.reflection)--运行cmd/server/main.go
您可以对“热重新加载”测试执行相同的操作:
reflection$(cat.reflection)--进行测试。/-v
还有一个配置选项,您可以在其中指定同时运行的多个命令,但我并不真正使用它。如果有人仍在寻找解决方案,我编写了一些shell脚本来实现这一点,它可以通过docker环境使用,repos at您可以使用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"
}
您确实需要nodej才能工作
但它比我迄今为止使用的任何其他特定于go的工具都要好得多。go worldfresh
&glide
但是我将使用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
使用-gnpm i-g节点安装
转到代码目录并运行:
nodemon --watch './**/*.go' --signal SIGTERM --exec 'go' run cmd/MyProgram/main.go
每当任何.go
文件更改时,这将发送SIGTERM,并将运行go-run cmd/Myprogram/main.go
完全跨平台。我使用了一个名为
要安装brew安装entr
(mac)
或者,sudo apt get install entr
(linux)
要在上重新编译并运行文件更改,请运行以下命令
ls**/*.go | entr go run main.go
不是一个真正的“围棋”问题,你试过了吗:nohup./foo>/var/log/foo/out.log&
@MartinGallagher谢谢,它很有效。看起来它不运行二进制文件,它只构建它们。是否有其他解决方案可以帮助我们完成剩下的工作?答案很旧,但CompiledEmon也会使用CompiledEmon-command=“./MyProgram-my options”
运行它,只有在当前目录树中修改程序时,此方法才有效。如果软件包位于fs中的其他位置,并且被修改,则不会重新启动应用程序。像这样的短信更聪明我喜欢--exclude.swp。。。这里很有趣。这是救命恩人,谢谢。使用nodemon比标准的appengine filewatcher要好得多。下面是适用于我感兴趣的“python dev_appserver.py app/--automatic_restart=no”的exec命令。为什么选择fresh
而不是glide
?是什么使这两种方法比compiledemon
或reflect
更吸引您?看起来reflect
(现在)有一种直接读取配置文件的方法。您的第三个示例可以重写为reflection-c.reflection--go run cmd/server/main.go
。感谢@ESV,没有注意到这一更改,很高兴知道。但是,正确安装npm
可能会很棘手(并且是特定于平台的)nvm
可能是获得npm
的最佳方式:npm是完全跨平台的,如果您将npm与sudo一起使用,那么您只是错误地安装了它。NVM不解决跨平台问题,它解决的是版本问题,就像在节点世界中一样,它的工作方式很有魅力。这个命令的问题是它不能捕获新文件。它只监视初步列表中列出的文件。