web-dev-qa-db-ja.com

ファイルの変更時に自動再コンパイルしてサーバーをリロードします

AppEngineがこれを行うことは知っていますが、コーディングはしていません。

Guard from Ruby worldを使用して、.goファイルの変更をリッスンし、次のコマンドを実行してみました。

killall foo
go build -race
./foo &

ただし、fooをバックグラウンドに送信することはなく、無期限にハングします。

この問題をどのように解決していますか?ソリューションもクロスプラットフォームである必要があります(GNU/LinuxおよびMac)。

12

友人がgo用の簡単なCompileDaemonを作成し、私自身の小さなnet/http-projectsの魅力のように機能しました。

ここでリポジトリを見つけることができます: https://github.com/githubnemo/CompileDaemon

19
krizz

CodegangstaのGinを試すこともできます。ファイアアンドフォーゲットです。

https://github.com/codegangsta/gin

編集:私は CompileDaemon 最近は好きです。ジンは時々リクエストを受け付けません

11
Bijan

最近、 reflex ツールを発見しました。それは速く、魅力のように機能します。これは、nodemon(nodejs worldから)およびguard(Ruby worldから))と非常によく似ています。

ほとんどの場合、私は以下のようにそれを使用しています:

_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

同時に実行するコマンドの数を指定できるconfigオプションもありますが、私は実際には使用していません。

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が必要です。
しかし、これまでに使用した特定のツールよりもはるかに優れています。

1
pandey909

誰かがまだ解決策を探しているなら、私はこれを行うためにいくつかのシェルスクリプトを書きました、そしてそれはdocker環境、 https://github.com/zephinzer/golang-dev のリポジトリを介して使用できます

1
zephinzer

標準の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;
1
hilnius

ここGOの世界には2つの主要な候補がありますfreshglide

しかし、私はFreshhttps://github.com/gravityblast/fresh

0
STEEL