我知道AppEngine这样做,但我不是为它编码。
我尝试使用Ruby世界中的Guard
来监听.go
文件的更改,并执行以下命令:
killall foo
go build -race
./foo &
但它永远不会将foo
发送到后台,它只是无限期挂起。
你们是如何解决这个问题的?解决方案也必须是跨平台的(GNU / Linux和Mac)。
答案 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才能正常工作。
但是比我迄今为止使用的其他任何特定工具要好得多。