在文件更改时自动重新编译和重新加载服务器

时间:2013-10-26 09:31:50

标签: go guard

我知道AppEngine这样做,但我不是为它编码。

我尝试使用Ruby世界中的Guard来监听.go文件的更改,并执行以下命令:

killall foo
go build -race
./foo &

但它永远不会将foo发送到后台,它只是无限期挂起。

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

10 个答案:

答案 0 :(得分:18)

一位朋友写了一个简单的Compile Daemon for go,就像我自己的小网/ http项目的魅力一样。

您可以在此处找到存储库:https://github.com/githubnemo/CompileDaemon

答案 1 :(得分:10)

您也可以通过Codegangsta试用Gin。这是火,忘了。

https://github.com/codegangsta/gin

编辑: 我现在更喜欢CompileDaemon。杜松子酒有时不接受请求

答案 2 :(得分:3)

另一种选择,如果您的计算机上安装了nodejs

使用-g npm i -g nodemon安装nodemon

转到您的代码目录并运行:

nodemon --watch './**/*.go' --signal SIGTERM --exec 'go' run cmd/MyProgram/main.go

这将在每次.go文件发生任何更改时发送SIGTERM并运行go run cmd/Myprogram/main.go

完全跨平台。

答案 3 :(得分:2)

我最近发现了一个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

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

答案 4 :(得分: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;

答案 5 :(得分:1)

我使用了一个名为entr

的工具

要安装 "replacerules.rules": { "svg-path": { "find": ["(?<!^ +)([MmLlHhVvCcSsQqTtAaZz]) *","(?<=^ +)([MmLlHhVvCcSsQqTtAaZz]) *"], "replace": ["\n $1 ","$1 "] } }, (mac)
brew install entr(Linux)

要重新编译并运行sudo apt-get install entr文件更改,请运行以下命令...

.go

答案 6 :(得分:1)

nodemon 有一个 go 版本:https://github.com/mitranim/gow

class MealPlanModel {
    
    var delegate:MealPlanProtocol?
    var listener:ListenerRegistration?
    var mealPlan = [MealPlan]()
    
    func getMealPlans(starred starredOnly:Bool = false, textToQuery searchText:String = "", easyFiltered easyOnly:Bool = false,  cheapFiltered cheapOnly:Bool = false, highProteinFiltered highProteinOnly:Bool = false, vegetarianFiltered vegetarianOnly:Bool = false) {

        // Detach any listener
        listener?.remove()
        
        // Get a reference to the database
        let db = Firestore.firestore()
        
        var query:Query = db.collection("mealPlans")
        
        if cheapOnly == true {
             query = query
                .whereField("isCheap", isEqualTo: true)
        }
        
        if easyOnly == true {
             query = query
                .whereField("isEasy", isEqualTo: true)
        }

        func queryData() {
            
            self.listener = query.addSnapshotListener({ (snapshot, error) in
                
                // Check for errors
                if error == nil && snapshot != nil {
                    
                    var mealPlans = [MealPlan]()
                    
                    // Parse documents into mealPlans
                    for doc in snapshot!.documents {
                        
                        let m = MealPlan(
                            docID: doc["docID"] as? String,
                            title: doc["title"] as? String)
                        
                        mealPlans.append(m)
                    }
                    DispatchQueue.main.async {
                        self.delegate?.mealPlansRetrieved(mealPlans: mealPlans)
                    }
                }
            })
        }
        
        queryData()
        
    }
}

使用

go install github.com/mitranim/gow@latest

答案 7 :(得分:0)

如果有人仍在寻找解决方案,我写了一些shell脚本来做到这一点,并且它可以通过docker环境使用,仓库位于https://github.com/zephinzer/golang-dev

答案 8 :(得分:0)

GO世界document.getElementsByClassName("thank-you")[0].classList.remove("hide"); fresh中有2个主要竞争者

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

答案 9 :(得分:-2)

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