buffalo build 默认执行前端构建、资源打包、模板编译和环境变量硬编码;顺序不可跳过,缺一将导致404或空白页,且不执行数据库迁移。

Buffalo 的 buffalo build 不是单纯打包二进制,它会强制触发前端构建、资源打包、模板编译和环境变量注入;跳过任一环节都可能导致生产环境 404 或渲染空白。
buffalo build 默认行为到底做了什么
执行 buffalo build 时,框架实际串联了多个阶段,顺序不可跳过:
- 先运行
npm run build(或yarn build),把assets/编译成public/下的静态文件 - 再调用
packr2扫描public/和templates/,将它们嵌入 Go 二进制 - 最后读取
buffalo.yaml中的env配置,把GO_ENV等变量硬编码进二进制(不是运行时读取) - 不会自动执行数据库迁移——
buffalo build只管打包,不碰 DB
为什么 build 出来的二进制访问 /assets/app.css 404
常见原因是 public/ 目录为空或缺失,导致 packr2 打包时没东西可嵌入。这通常发生在:
- 你删了
assets/但没手动补public/(哪怕只放个public/.keep) -
npm run build失败静默退出(比如 webpack 配置错、缺少node_modules),而buffalo build默认不中止 - 用了
--skip-assets但忘了加--static,结果既没走 webpack 也没启用 packr,二进制里压根没资源路径
验证方式:运行 ./myapp --help,如果输出里没有 packr 相关提示,说明资源未打包成功。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
如何跳过前端构建但保留模板渲染
纯 API 项目不需要 JS/CSS,但依然要渲染 JSON 或 HTML 模板(如错误页)。这时不能简单删 assets/,得用组合参数:
-
buffalo build --skip-assets --static:跳过npm run build,但仍让packr2打包templates/和空public/ - 必须确保
public/存在(哪怕为空目录),否则--static会失效并退回到开发模式资源加载逻辑 - 若连模板都不需要(如完全无 UI 的 microservice),改用
buffalo build --api,它会禁用所有模板和 asset 相关逻辑
注意:--api 模式下 templates/ 不会被打包,c.Render() 调用会 panic。
build 后环境变量不生效的根源
buffalo build 把 buffalo.yaml 里的 env 块编译进二进制,运行时不再读 .env 或 shell 环境变量。典型陷阱:
- 开发时靠
DB_URL=xxx buffalo dev连库,build 后却连不上——因为buffalo.yaml里没配database_url字段 - 误以为
GO_ENV=production ./myapp能切换行为,实际无效;必须在buffalo.yaml中明确写env: production -
buffalo.yaml中的database_url是字符串插值,不支持环境变量语法(如${DB_URL}),只能写死或靠 CI 注入
最稳妥做法:CI 流程中用 sed -i 's/DB_URL:.*/DB_URL: '"$DB_URL"'/' buffalo.yaml 替换后再 build。










