Go 在文件更改时自动重新编译并重新加载服务器

Go 在文件更改时自动重新编译并重新加载服务器,go,guard,Go,Guard,我知道AppEngine会这么做,但我不是在为它编码 我尝试使用Ruby world中的Guard来监听文件上的更改,然后执行以下命令: killall foo go build -race ./foo & 但它从不将foo发送到后台,它只是无限期地挂起 你们是怎么解决这个问题的?解决方案也必须是跨平台的(GNU/Linux和Mac)。一位朋友为go编写了一个简单的编译守护程序,它对我自己的小型net/http项目来说非常有用 您可以在这里找到存储库:您也可以尝试使用Codegangs

我知道AppEngine会这么做,但我不是在为它编码

我尝试使用Ruby world中的
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 world
fresh
&
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

使用-g
npm 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不解决跨平台问题,它解决的是版本问题,就像在节点世界中一样,它的工作方式很有魅力。这个命令的问题是它不能捕获新文件。它只监视初步列表中列出的文件。