Buffalo 不支持多环境路由切换,路由定义不随 GO_ENV 变化;需通过配置驱动路径前缀、按环境注册中间件、完整填写 database.yml/session.yml 各环境区块,并在编译期指定 GO_ENV。

Buffalo 没有“多环境路由切换”这个概念——路由定义本身不随 GO_ENV 变化,真正需要隔离的是路由行为、中间件启用和路径前缀策略。
路由代码本身不区分环境,但注册方式必须解耦
Buffalo 的 app.Routes() 在所有环境下都执行同一份 Go 代码,硬写 if app.Env == "production" { app.GET("/admin", ...) } 不仅难维护,还会让测试失效。正确做法是把路由逻辑拆出条件判断,用配置驱动:
- 所有 API 路径统一加版本前缀,比如
UserListPath = "/api/v1/users",避免开发写/users、生产要改路径 - 用
app.Use()注册中间件时检查app.Env,例如开发环境加middleware.ParameterLogger,生产跳过 - 不要在
routes/app.go里直接调app.Mount()或app.ServeFiles(),这些静态资源服务只应在development启用
GO_ENV 影响的是中间件栈,不是路由表
Buffalo 在编译期根据 GO_ENV 决定是否注入 recovery、logger、parameter logger 等中间件,但不会删掉你写的 app.GET("/health", HealthHandler)。常见误判是以为设了 GO_ENV=production 就自动隐藏调试路由,其实它还在,只是没日志、没 panic 捕获——这反而更危险。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 开发环境默认启用
middleware.Automatic,包含recovery和parameter logger;生产环境会跳过它们 -
middleware.CORS必须显式调用app.Use(middleware.CORS())才生效,不会因环境自动开启/关闭 - 若想让某条路由只在开发可用(如
/debug/pprof),得手动加 guard:if app.Env == "development" { app.GET("/debug/pprof", PprofHandler) }
database.yml 和 session.yml 的环境区块必须完整填写
很多人以为只填 development 区块就够了,结果 GO_ENV=production buffalo build 启动时报 dial tcp 127.0.0.1:5432: connect: connection refused——因为 database.yml 里 production 区块缺失或字段不全,pop 连接器 fallback 到空配置,连本地 5432。
-
database.yml中每个环境区块(development、test、production)都必须独立声明dialect、host、port、user、password、database -
dialect必须小写且拼写精准:"postgres"✅,"postgresql"❌,"pg"❌ -
session.yml的secret字段在 production 下必须为 32+ 字符强随机字符串,开发可短些但不能为空,否则c.Session().Save()直接返回 500
最常被忽略的一点:Buffalo 的环境变量是编译期决定的,GO_ENV=production buffalo build 和 buffalo build && GO_ENV=production buffalo start 完全是两回事——后者生产的二进制包里仍含开发中间件,且 app.Env 固定为 "development"。










