I know AppEngine does this, but I\'m not coding for it.
I tried using Guard
from Ruby world, to listen on changes on .go
files, and execut
if anyone’s still looking for a solution, i wrote some shell scripts to do this and it’s usable via a docker environment, the repos at https://github.com/zephinzer/golang-dev
A friend wrote a simple Compile Daemon for go, worked like a charm for my own small net/http-projects.
You can find the repository here: https://github.com/githubnemo/CompileDaemon
You can use nodemon
for this. Simply create a nodemon.json file containing your configuration, files to watch, files to ignore, and command to execute when a file changes. Something like this configuration.
nodemon.json
{
"watch": ["*"],
"ext": "go graphql",
"ignore": ["*gen*.go"],
"exec": "go run scripts/gqlgen.go && (killall -9 server || true ) && go run ./server/server.go"
}
You do require nodejs for this to work.
But its far better then any other tool I've used so far that are go specific.
I've recently discovered a reflex tool. It's fast and works like a charm. It is very similar to nodemon (from nodejs world) and guard (from ruby world).
Most of the time I'm using it similar to below:
reflex -d none -s -R vendor. -r \.go$ -- go run cmd/server/main.go
But it maybe more convenient to have it's options in a file like .reflex, with contents like this:
-d none -s -R vendor. -r \.go$
So then you just run it like this
reflex $(cat .reflex) -- go run cmd/server/main.go
You can do same thing to "hot reload" tests:
reflex $(cat .reflex) -- go test ./... -v
There is also a config option where you can specify a number of commands you run same time, but I don't really use it.
After scrolling through the internet in search of a simple solution that was using standard linux tools (inotify & bash), I ended up creating this simple bash script that does the job.
I tested it in a container running golang:1.12 and using go run .
to serve files. read the script before using it, as it kills the go run
processes depending on a folder name, and if there are conflicts with other processes that you run it might kill them.
#!/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;
Another option, if you have nodejs installed on your machine
install nodemon with -g npm i -g nodemon
go to your code dir and run:
nodemon --watch './**/*.go' --signal SIGTERM --exec 'go' run cmd/MyProgram/main.go
This will send SIGTERM every time any .go
files changes and will run go run cmd/Myprogram/main.go
Fully cross platform.