buffalo build 默认不支持跨平台编译,正确命令是 goos=linux goarch=amd64 buffalo build --static;需删除 assets/、templates/、webpack.config.js,移除 plush/packr 依赖及 favicon/static 中间件,并改用 c.json() 替代 c.render()。

buffalo build 默认不支持跨平台编译
直接运行 buffalo build 会在当前系统环境(比如 macOS 或 Windows)下构建,产物依赖本地 libc 和架构,无法直接扔进 Linux 容器里跑。它底层调用的是 go build,但没透出 GOOS/GOARCH 控制权,也不会自动加 --ldflags="-s -w" 去瘦身。
必须用 GOOS=linux GOARCH=amd64 buffalo build --static
这是唯一能产出 Linux 可执行文件的正确命令。注意三点:
-
--static是关键:它让 Buffalo 强制使用静态链接(禁用 cgo),避免运行时找不到libc或libpthread - 环境变量必须写在
buffalo build前面,不能写成buffalo build GOOS=linux——那样会被当成参数传给 Buffalo CLI,直接报错 - 如果项目里残留了
assets/或templates/,buffalo build会卡在 webpack 编译或 plush 模板解析阶段,导致失败
删掉前端相关代码后再编译,否则必失败
纯 API 服务不需要这些,但 Buffalo 的 --api 模板默认全带:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 删掉整个
assets/目录和webpack.config.js - 注释或删除
app.Use(plugins.Favicon())、app.Use(plugins.Static()) - 确认
go.mod里没有github.com/gobuffalo/plush或github.com/gobuffalo/packr/v2——它们会触发模板/资源打包逻辑,和--static冲突 - 检查
app.go中是否还有c.Render(...)调用;API 应只用c.JSON(...)或c.Error(...)
验证产物是否真能跑在 Linux 上
别只看文件生成了就以为完事。进一个干净的 Ubuntu 容器试试:
docker run --rm -v $(pwd):/app -w /app ubuntu:22.04 ./myapp
常见失败原因:
- 报
no such file or directory:说明没加--static,动态链接失败 - 报
panic: template: ...:说明 plush 模板引擎还在被加载,templates/没清干净或 plush 依赖没从go.mod删掉 - 启动后立刻 exit 0:大概率是数据库连接池初始化失败,或
database.yml里写了本地路径(如./development.sqlite),Linux 容器里根本不存在
交叉编译不是加两个环境变量就结束的事——Buffalo 的构建链路里混着前端、模板、资源打包三套逻辑,删不干净,GOOS=linux 就只是个摆设。










