如何在Go中使用Gin框架和Fresh实现热更新并监控整个项目目录?

go用gin框架 实现热更新fresh
加入目录结构是/myapp/cmd/server/main.go
那我需要进入到server 执行fresh 但是fresh只能监控到当前执行的目录也就是server和他的子目录
我应该如何才能在myapp下面执行呢 这样能监控所有

测试

阅读 613
1 个回答

使用 Fresh 在 Go 项目中实现热更新

目标

/myapp 根目录下运行 fresh,同时监控整个项目(包括 /myapp/cmd/server/main.go 及其它子目录)。

1. 理解 Fresh 的工作原理

  • fresh 是 Go 的热重载工具,监控 .go 文件变化后自动重新编译和运行程序。
  • 默认行为fresh 仅监控执行命令时的当前目录及其子目录。
  • 问题:在 /myapp/cmd/server 目录下运行 fresh 时,无法监控 /myapp 根目录及其它平行目录(如 /myapp/pkg/myapp/internal)。

2. 目录结构

假设你的项目结构如下:

/myapp
├── cmd
│   └── server
│       └── main.go
├── internal
│   └── somepackage
│       └── somefile.go
├── pkg
│   └── anotherpackage
│       └── anotherfile.go
├── go.mod
└── fresh.conf

3. 解决方案

步骤 1:安装 Fresh

确定已安装 fresh

go install github.com/pilu/fresh@latest

步骤 2:创建 Fresh 配置文件

/myapp 目录下创建 fresh.conf 文件:

root: .
tmp_path: ./tmp
build_name: myapp
build_log: ./tmp/build.log
build_delay: 200
build_target: ./cmd/server
runner: ./tmp/myapp
watch:
  - ./**/*.go
exclude:
  - vendor
  - tmp

配置说明

  • root: . → 设定项目根目录为 /myapp
  • build_target: ./cmd/server → 构建目标为 /myapp/cmd/server/main.go
  • watch: - ./**/*.go → 监控整个项目的 .go 文件。

步骤 3:运行 Fresh

/myapp 目录下执行:

fresh

此时 fresh 会:

  • 监控 /myapp 下所有 .go 文件(包括 cmd, internal, pkg 等)。
  • 编译 /myapp/cmd/server/main.go 并生成可执行文件 /myapp/tmp/myapp
  • 运行应用,在文件变化时自动重新编译和重启。

4. 替代方法:命令行参数

如果不想使用配置文件,可以直接在 /myapp 目录执行:

fresh -c fresh.yml -w . -b ./cmd/server

参数解析

  • -w . → 监控 /myapp 目录及子目录。
  • -b ./cmd/server → 构建目标为 /myapp/cmd/server

5. 运行测试

  1. /myapp 目录下执行:

    fresh
  2. 访问 http://localhost:8080/ping,应该返回:

    {"message": "pong"}
  3. 修改 main.go 或其它 .go 文件(例如添加新路由)。
  4. fresh 发现文件变更后自动重启应用。
  5. 重新访问 http://localhost:8080/ping,确认更新生效。

6. 常见问题

🔹 Q:fresh 没有监控某些目录?
A:检查 fresh.conf 中的 watch 配置,建议使用:

watch:
  - ./**/*.go

🔹 Q:编译失败?
A:查看 /myapp/tmp/build.log,检查是否有语法错误或依赖问题。

🔹 Q:fresh 没有自动重启?
A:保证修改的文件在 watch 目录中,且未被 exclude 排除。


推荐问题