Go Auto-Recompile and Reload Server on file change

后端 未结 9 876
清酒与你
清酒与你 2020-12-15 22:14

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

相关标签:
9条回答
  • 2020-12-15 22:41

    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

    0 讨论(0)
  • 2020-12-15 22:42

    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

    0 讨论(0)
  • 2020-12-15 22:42

    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.

    0 讨论(0)
  • 2020-12-15 22:46

    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.

    0 讨论(0)
  • 2020-12-15 22:47

    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;
    
    0 讨论(0)
  • 2020-12-15 23:01

    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.

    0 讨论(0)
提交回复
热议问题