buffalo 通过 go_env 环境变量读取当前运行环境,默认值为 development;代码中应统一使用 buffalo.env 字符串直等判断,避免提前缓存或模糊匹配。

Buffalo 怎么读取当前运行环境(development/test/production)
Buffalo 默认通过 GO_ENV 环境变量决定运行环境,而不是依赖 ENV 或 RACK_ENV。没设时默认为 development,这是最常被忽略的前提。
常见错误现象:本地 buffalo dev 正常,但用 buffalo build 部署后行为异常——大概率是 GO_ENV 没显式设置,导致生产环境误走 development 分支逻辑。
-
GO_ENV=production buffalo build是推荐的构建方式,而非靠.env文件自动加载(.env默认只被buffalo dev读取) - 代码中判断环境应统一用
buffalo.Env,不要自己解析os.Getenv("GO_ENV")—— 因为buffalo.Env还会做标准化(比如把prod归一为production) - 在
app.go初始化阶段,buffalo.Env已可用;但在init()函数里调用可能为"",因为此时框架尚未完成环境加载
为什么 buffalo dev 和 buffalo build 环境行为不一致
根本原因是两者加载环境变量的时机和范围不同:buffalo dev 会自动读取项目根目录下的 .env 文件并注入进程环境;而 buffalo build 默认不加载任何外部文件,完全依赖启动时已存在的环境变量。
典型陷阱:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 在
.env里写了GO_ENV=production,但执行buffalo build时没生效 → 因为buffalo build忽略.env - 用
make build封装构建命令,却忘了在 Makefile 里export GO_ENV=production→ 子 shell 不继承父 shell 的导出变量 - CI/CD 流水线里用
docker build构建镜像,但没在Dockerfile中ENV GO_ENV=production→ 容器内buffalo.Env返回空字符串
如何在 handler 或 middleware 中安全判断环境
直接读 buffalo.Env 即可,它返回的是字符串,值为 "development"、"test" 或 "production"。不要用布尔比较或模糊匹配。
示例:
func AuthMiddleware(next buffalo.Handler) buffalo.Handler {
return func(c buffalo.Context) error {
if buffalo.Env == "development" {
// 开发环境跳过鉴权
return next(c)
}
// 生产环境执行真实校验
return auth.Check(c)
}
}
注意:Buffalo 不提供类似 Rails 的 Rails.env.development? 链式方法,所有判断都基于字符串直等。别写 strings.HasPrefix(buffalo.Env, "dev") —— 这在 buffalo test 下会误判。
真正容易被忽略的点是:环境变量判定必须发生在请求处理链中,不能提前缓存在包级变量里。比如在 actions/app.go 顶层写 var isProd = buffalo.Env == "production",这个值在编译期就固化了,后续无论怎么改 GO_ENV 都不会变。










