Revel框架在Go 1.16+下go get失败,根本原因是其依赖code.google.com/p/go.net/websocket等已失效且未适配Go Modules;需手动用go mod init、go get指定版本或commit、replace修复依赖,并仅构建CLI工具。

Revel 框架在 Go 1.16+ 环境下无法用传统 go get 直接安装成功,根本原因是其历史依赖(如 code.google.com/p/go.net/websocket、gopkg.in/fsnotify.v1)已失效或被弃用,且项目本身未迁移到 Go Modules —— 你必须手动干预依赖解析过程,否则会卡在“cannot find package”错误里。
为什么 go get github.com/revel/revel 会失败
Revel 主仓库(github.com/revel/revel)及其命令行工具(github.com/revel/cmd/revel)长期未适配 Go Modules,默认仍走 GOPATH + go get 老路径。但自 Go 1.18 起,go get 已默认禁用 GOPATH 模式,且不再自动拉取 Mercurial(hg)仓库(如旧版 code.google.com),导致:
-
gopkg.in/fsnotify.v1返回 404(该域名已停服) -
code.google.com/p/go.net/websocket无法通过 hg 获取 -
github.com/agtorre/gocolorize等间接依赖缺失,且无对应 Go module 版本 - 即使手动补全所有依赖,
go build仍可能因 import cycle(如golang.org/x/net/websocket循环引用)失败
用 Go Modules 强制构建 revel 命令行工具
不推荐修复整个 Revel 框架源码的模块兼容性,而是聚焦于能跑起来的最小可用路径:只构建 revel CLI 工具(github.com/revel/cmd/revel),跳过框架 runtime 的编译。实操步骤如下:
- 新建空目录,
go mod init revel-cli初始化模块 - 运行
go get github.com/revel/cmd/revel@v1.2.1(这是最后一个带 tag 的 release,兼容 Go 1.16–1.21) - 若报
unknown revision v1.2.1,改用 commit hash:go get github.com/revel/cmd/revel@5a7e7b9(对应 2022 年最后一次有效提交) - 执行
go install github.com/revel/cmd/revel@latest,生成可执行文件到$GOPATH/bin/revel - 验证:
revel version应输出revel v1.2.1或类似版本号
创建项目时绕过依赖下载失败
即使 CLI 工具装好了,revel new myapp 仍会尝试 go get 框架依赖并失败。正确做法是:
- 先用 CLI 创建骨架:
revel new myapp(它只生成文件,不拉依赖) - 进入
myapp目录,手动初始化 Go Modules:go mod init myapp - 编辑
app/init.go,将import "github.com/revel/revel"改为指向本地或 fork 后的兼容分支,例如:import "github.com/robfig/revel"→import "github.com/revel/revel"(注意作者已从 robfig 迁移) - 运行
go mod tidy,它会自动降级或替换部分依赖(如用golang.org/x/net替代旧 websocket) - 若仍报错,添加 replace 临时修复:
go mod edit -replace gopkg.in/fsnotify.v1=github.com/fsnotify/fsnotify@v1.6.0
关键兼容点和容易忽略的坑
Revel 不是“开箱即用”的现代 Go Web 框架,它的生态断层真实存在:
-
revel run内部调用的是go run,但 Go 1.21+ 默认启用-mod=readonly,导致热重载时go mod tidy失败 —— 必须在conf/app.conf中加revel.run.mode = dev并确保GO111MODULE=on - SQLite 驱动(
github.com/mattn/go-sqlite3)需 CGO_ENABLED=1,Windows 下必须装 MinGW-w64(非 MSYS2),否则报cc1.exe: sorry, unimplemented: 64-bit mode -
go.sum文件必须保留,哪怕依赖看起来“没用”—— Revel 的插件机制(如 i18n、session)在运行时动态加载,校验缺失会导致 panic - 不要试图用
go install github.com/revel/revel@latest安装框架本身,它没有 module-aware 的 main 包,只会报no Go files


















