Dependabot仅自动更新composer.json中的依赖版本号,不执行composer update、不修改composer.lock;CI必须显式运行composer update --lock --no-install同步lock文件,否则composer install将失败。

Dependabot 能自动提 PR 更新 composer.json 中的依赖版本号,但**它从不运行 composer update,也不会碰 composer.lock**——这是绝大多数人踩坑的起点。
Dependabot 只改 composer.json,不碰 composer.lock
它读取你当前的版本约束(比如 "phpunit/phpunit": "^10.5"),再查 Packagist 上满足该约束的最新版本,然后生成一个只改这一行的 PR。整个过程不执行任何命令,不下载包,也不校验 lock 文件一致性。
- 如果你的 CI 在 Dependabot PR 中直接跑
composer install,会立刻失败,报错Your lock file does not contain a compatible set of packages - Dependabot 不支持子目录项目:
composer.json必须在仓库根目录,.github/dependabot.yml也必须放对位置,写成dependabot.yaml或放在.github/dependabot/下都不生效 -
directory字段不支持通配符,"/packages/*"这种写法完全被忽略
CI 必须显式运行 composer update --lock --no-install
这是同步 composer.lock 的唯一安全方式。它只更新 lock 文件里的哈希和版本号,不下载源码、不生成 autoload、不触发脚本——轻量且可控。
覆盖宏观策略、固收研究、行业公司深度分析、量化因子、大类资产配置、可转债、市场情绪、政策快评、行业景气度追踪等34项核心研究能力,证券研究员的全能数字助手。
- 别用
composer update(无参数):它会顺手升级其他未提及的依赖,破坏语义化控制 - 别用
composer install:它依赖 lock 文件已就绪,而此时 lock 还没更新 - GitHub Actions 中要监听
pull_request_target事件,不是pull_request,否则拿不到 secrets 和主分支代码 - 建议加
git diff --quiet composer.lock判断是否真有变更,避免空 commit
打 tag 后 Packagist 不更新?检查 git push --tags
Packagist 不监听 GitHub 的 tag 创建事件,它靠的是 GitHub Service Hook 或 GitHub App 接收推送。如果你在 CI 里用 git tag + git push,默认不会推 tag。
- 必须显式加
--tags:git push origin --tags -
on: push: tags触发器只响应手动 push tag,不会被 workflow 内部的git push触发 - 验证是否生效:用
curl -s "https://repo.packagist.org/p/vendor/name.json" | grep '"time":'看最新版时间戳是否刷新
最常被忽略的其实是权限链:Dependabot PR → CI 拿到主分支代码 → 执行 composer update --lock --no-install → 提交修改后的 composer.lock → 这整条路径里任意一环权限或配置错位,就会卡在“版本号变了但 install 失败”。










