buffalo new --api 是跳过模板渲染链路的标记,非单纯“生成 API 项目”开关;必须与 --skip-pop 配合使用才能避免 plush 上下文缺失导致 panic,且生成后需手动清理 actions/render.go 中 r.HTML() 引用以确保编译通过。

直接用 buffalo new 默认参数生成的项目,90% 的代码对纯 API 服务是冗余的——删不干净会编译失败,删过头又可能破坏中间件链。裁剪不是“删文件”,而是按功能边界做取舍。
什么时候必须加 --api,什么时候反而不能加
--api 不是“生成 API 项目”的开关,而是“跳过模板渲染链路”的标记。它只影响后续命令(如 generate action)是否创建 templates/ 目录和 r.HTML() 调用。
- 新建项目时加
--api:会禁用plush渲染器注册、不生成templates/、跳过assets/初始化,但models/和database.yml仍存在(除非再加--skip-pop) - 不加
--api却想写 API:你得手动删掉所有r.HTML()、清空templates/、注释掉csrf.Middleware和session.Middleware,否则 POST 请求直接 400 -
buffalo generate resource users后再补加--api没用:模板和c.Render()已生成,必须人工替换为c.JSON()
--skip-pop 必须和 --api 配合使用
单独执行 buffalo new myapp --skip-pop 会 panic,因为默认全栈模式依赖 r.HTML(),而跳过 Pop 后 plush 上下文未初始化,r.HTML() 调用直接崩溃。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 正确姿势:
buffalo new myapp --api --skip-pop—— 此时框架不引入pop、plush、packr,也不生成models/或database.yml - 生成后检查
actions/render.go:如果还存在,删掉或清空内容,否则go build会报undefined: r - 后续要用 GORM 或 sqlx?完全自由——
go mod init加依赖,自己写db.Open(),Buffalo 不干涉
前端构建支持要不要开,取决于你是否需要 buffalo dev 自动编译
--with-nodejs 不是“加 React”,而是启用 assets/ 目录 + package.json + buffalo dev 对 npm run build 的监听。不开它,buffalo dev 仍能跑 Go 服务,但静态资源路径全部 404。
- 纯 JSON API:不要加
--with-nodejs,也别手动建assets/——否则buffalo build会尝试打包不存在的资源,卡在exec: "npm": executable file not found - 带管理后台的 API:加
--with-nodejs,但删掉app.Use(plugins.Static())和app.Use(plugins.Favicon()),避免暴露/public或/favicon.ico - 已加
--with-nodejs但没写前端?运行前先npm install,否则buffalo dev启动时会因找不到buildscript 失败
数据库驱动选错,buffalo db 会静默失效
buffalo db 命令根本不支持 SQLite,dialect: sqlite3 在 database.yml 里是无效配置。报 unknown dialect "sqlite3" 不是拼写错误,是 pop v6+ 彻底移除了驱动注册。
- PostgreSQL:必须写
dialect: postgres(不是postgresql),且连接串加sslmode=disable - MySQL:写
dialect: mysql,连接参数必须含parseTime=true,否则time.Time字段扫描为空 - 真要 SQLite?放弃
buffalo db,改用goose或migrate独立管理迁移,database.yml仅作占位
最易被忽略的一点:buffalo new 生成的 module 名来自当前目录名,含大写字母或点号(如 MyApp、my.app)会导致 go mod tidy 失败,错误信息却是 no required module provides package——得翻 go.mod 第一行手动修正。

















