go mod tidy 必须在 buffalo dev 前执行,否则子依赖(如 pop/v6)未拉取会导致 panic: unknown dialect "postgres";npm install 不可跳过,否则 buffalo dev 因缺失 node_modules 退出;database.yml 中变量须以 APP_ 为前缀才被 envy 加载。

go mod tidy 必须在 buffalo dev 前执行
Buffalo 生成的 go.mod 只声明顶层依赖(如 github.com/gobuffalo/buffalo),子依赖(如 github.com/gobuffalo/pop/v6、github.com/markbates/inflect)不会自动拉取。不执行 go mod tidy 就跑 buffalo dev,大概率在初始化 model 或连接数据库时 panic,错误类似 panic: unknown dialect "postgres"——因为 pop 驱动没被真正加载。
实操建议:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 每次
git pull或切换分支后,先运行go mod tidy,不要依赖 IDE 自动补全 - 若项目含私有模块,确认
GO_PRIVATE已设置,否则tidy会卡在认证环节 - CI/CD 中禁止用
go mod download替代tidy,前者不校验依赖图一致性,可能导致本地能跑、CI 报错
npm install 不是可选项,哪怕你删了 assets/
buffalo dev 启动时默认尝试调用 Webpack 编译前端资源。它会检查 node_modules 是否存在,不存在就直接退出并报错 exec: "npm": executable file not found in $PATH 或更隐蔽的 failed to compile assets,哪怕你压根不打算用前端部分。
实操建议:
- 首次运行前必须执行
npm install(或yarn install),不能跳过 - 如果确定永久不用 assets,可在
buffalo dev后加--skip-assets参数(Buffalo v1.0.1+ 支持),但首次安装仍需npm install - 使用 Docker 时,在
Dockerfile中RUN npm install必须放在COPY . .之后、buffalo dev之前,否则构建阶段找不到package.json
database.yml 里的变量不会被 envy 自动加载
Buffalo 使用 github.com/gobuffalo/envy 加载环境变量,但它**只读取以 APP_ 为前缀的变量**。而 database.yml 中常见写法如 password: 或 url: 是无效的——DBPASSWORD 和 DATABASE_URL 不会被注入,导致连接失败,错误信息常为 password authentication failed for user "postgres"。
实操建议:
- 统一改用
APP_DATABASE_URL、APP_DB_PASSWORD等带APP_前缀的变量名 - 在
actions/app.go初始化处加日志验证:log.Printf("DB URL from env: %s", os.Getenv("APP_DATABASE_URL")) - 若必须兼容旧变量名,改用
os.LookupEnv("DBPASSWORD")显式读取,绕过envy
buffalo plugins install 的依赖不进 go.mod
Buffalo 插件(如 buffalo-plugins、buffalo-pop)通过 CLI 安装到全局 Go bin 目录,它们的代码**不会出现在项目 go.mod 中**。这意味着:go mod vendor 不会打包它们,go run 也不感知其存在;一旦插件版本升级或卸载,buffalo db migrate 等命令可能突然失效,且错误提示模糊(如 command not found: buffalo-db)。
实操建议:
- 把插件安装命令写进
Makefile或.devcontainer.json,避免靠记忆执行 - CI 流程中显式运行
go install github.com/gobuffalo/buffalo-plugins@latest,而非假设已存在 - 生产部署时,
buffalo build不依赖插件,但开发期所有buffalo *子命令都依赖它们——别误以为“build 出来了就能删插件”

















