Go Auto-Recompile and Reload Server при смене файла

Я знаю, что AppEngine делает это, но я не кодирую его.

Я попытался использовать Guard из мира Ruby, чтобы прослушать изменения на .go файлах и выполнить следующие команды:

killall foo
go build -race
./foo &

Но он никогда не посылает foo в фон, он просто висит бесконечно.

Как вы решаете эту проблему? Решение также должно быть кросс-платформенным (GNU/Linux и Mac).

Ответ 1

Друг написал простой компилятор Daemon для go, работал как шарм для моих собственных небольших сетевых/http-проектов.

Здесь вы можете найти репозиторий: https://github.com/githubnemo/CompileDaemon

Ответ 2

Вы также можете попробовать Джин от Codegangsta. Это огонь и забыть.

https://github.com/codegangsta/gin

ОБНОВЛЕНИЕ: Я предпочитаю CompileDaemon в настоящее время. Джин иногда не принимает запросы

Ответ 3

Недавно я обнаружил рефлекторный инструмент. Это быстро и работает как шарм. Он очень похож на nodemon (из мира nodejs) и охранник (из рубинового мира).

В большинстве случаев я использую его, как показано ниже:

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

Существует также опция конфигурации, в которой вы можете указать несколько команд, которые вы запускаете в то же время, но я действительно не использую их.

Ответ 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 работал.
Но это намного лучше, чем любой другой инструмент, который я использовал до сих пор, который идет конкретно.

Ответ 5

если кто-то все еще ищет решение, я написал несколько сценариев оболочки, чтобы сделать это, и его можно использовать через среду докера, репозитории на https://github.com/zephinzer/golang-dev