20

我知道 AppEngine 会这样做,但我不会为它编写代码。

我尝试使用GuardRuby 世界来监听.go文件的变化,并执行以下命令:

killall foo
go build -race
./foo &

但它从不发送foo到后台,它只是无限期地挂起。

你们是如何解决这个问题的?解决方案也必须是跨平台的(GNU/Linux 和 Mac)。

4

11 回答 11

28

一位朋友为 go 编写了一个简单的编译守护程序,对我自己的小型 net/http-projects 工作就像一个魅力。

你可以在这里找到存储库:https ://github.com/githubnemo/CompileDaemon

于 2013-11-13T10:58:08.477 回答
16

另一种选择,如果您的机器上安装了 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

完全跨平台。

于 2020-06-18T14:54:42.380 回答
14

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

于 2015-02-20T12:40:16.840 回答
13

我最近发现了一个反射工具。它速度很快,就像一个魅力。它与 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

还有一个配置选项,您可以在其中指定同时运行的许多命令,但我并没有真正使用它。

于 2018-06-18T21:13:18.577 回答
4

你可以用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 才能工作。
但它比我迄今为止使用的任何其他特定工具都要好得多。

于 2019-02-14T05:19:03.977 回答
3

我使用了一个名为entr的工具

安装brew install entr(mac)
sudo apt-get install entr(linux)

要重新编译并运行.go文件更改,请运行以下命令...

ls **/*.go | entr go run main.go
于 2020-07-10T13:38:35.787 回答
3

有一个 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
于 2021-07-29T21:56:54.927 回答
2

GO 世界有 2 个主要竞争者fresh&glide

但我会选择Fresh https://github.com/gravityblast/fresh

于 2019-09-18T18:58:05.657 回答
2

在互联网上滚动搜索使用标准 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;
于 2020-01-10T23:56:00.980 回答
1

最好的选择是在你的机器上安装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
于 2021-08-31T09:56:22.960 回答
0

如果有人仍在寻找解决方案,我编写了一些 shell 脚本来执行此操作,它可以通过 docker 环境使用,https://github.com/zephinzer/golang-dev上的 repos

于 2018-12-20T16:21:50.337 回答