dependabot.yml 必须严格置于 .github/dependabot.yml 路径,仅识别该固定位置;需显式声明 package-ecosystem: composer,并正确配置 directory、versioning-strategy 和 ignore(含完整 vendor/name 格式)。

dependabot.yml 必须放在 .github/ 目录下
Dependabot 不会扫描项目根目录或 composer.json 所在路径来查找配置文件,它只认 .github/dependabot.yml 这个固定位置。放错地方(比如丢进 config/ 或直接和 composer.json 并列)会导致完全不生效,且 Dependabot 不报错、不提醒——静默忽略。
实操建议:
- 确保路径是
.github/dependabot.yml,注意.github是隐藏目录,大小写敏感 - 首次提交后,可在 GitHub 仓库的 “Settings → Code security and analysis → Dependabot alerts” 页面确认是否已启用
- 如果已有
.github/dependabot.yml但没反应,先检查 YAML 语法是否合法(用在线 YAML linter 验证),缩进错误是最常见原因
composer 更新必须显式声明 package-ecosystem: composer
Dependabot 默认不自动识别 PHP 项目或 composer.json;你得明确告诉它:“这里要用 Composer 生态”。漏写 package-ecosystem: composer,即使路径对、文件名对,它也会跳过所有 PHP 依赖更新。
常见错误现象:
- PHP 依赖长期不收 PR,但 Node.js 依赖正常更新(说明其他 ecosystem 配置生效了,唯独 composer 没配)
- GitHub Actions 日志里出现
Skipping update for composer: no config found
最小可用配置示例:
version: 2
updates:
- package-ecosystem: "composer"
directory: "/"
schedule:
interval: "weekly"directory: "/" 表示从仓库根开始找 composer.json;若项目是子模块或 composer.json 在 backend/ 下,则必须改成 directory: "/backend",否则找不到文件
versioning-strategy 控制 PR 中的版本号写法
Composer 默认使用 ^ 或 ~ 约束符,但 Dependabot 的 versioning-strategy 决定它生成 PR 时怎么改 composer.json 里的版本字段。选错策略会导致语义混乱甚至破坏兼容性。
关键参数差异:
-
lockfile-only:只更新composer.lock,不动composer.json—— 安全,适合不想手动干预版本范围的团队 -
bump:按当前约束规则升级到最新兼容版(如"monolog/monolog": "^2.8"→"^2.10"),最常用 -
widen:放宽约束(如"^2.8"→"^2.8 || ^3.0"),危险,极少需要 -
pin:改成精确版本("2.8.0"),失去自动小版本更新能力,慎用
性能影响:选 lockfile-only 时,Dependabot 不解析 composer.json 版本逻辑,CI 构建更快;但你得靠 composer update --dry-run 主动检查兼容性断层
ignore 字段不能只写包名,必须带 vendor/name 格式
想忽略某个包(比如暂时不想升 phpunit/phpunit),ignore 列表里写 "phpunit" 或 "phpunit/phpunit" 都不行——Dependabot 要求完整 vendor/name,且区分大小写。
正确写法示例:
- package-ecosystem: "composer"
directory: "/"
schedule:
interval: "weekly"
ignore:
- dependency-name: "phpunit/phpunit"
versions: ["*", ">=10.0.0"]容易踩的坑:
-
dependency-name: "phpunit"→ 无效,会被忽略 -
versions: ["^9.0"]→ 错误,versions接受的是具体版本号或通配符"*",不是约束表达式 - 多个 ignore 条件叠加时,Dependabot 是“任意匹配即忽略”,不是“全部满足才忽略”
复杂点在于:Dependabot 对 composer 的 ignore 不支持正则或通配符匹配 vendor 名,所以没法一次性忽略所有 symfony/* 包,每个都得单独列










