本地包依赖变更后主项目不会自动更新,必须手动执行composer update vendor/name --with-dependencies和composer dump-autoload;否则新增依赖不安装、autoload映射不刷新、旧依赖不清理。

本地包改了依赖,主项目不会自动更新
Composer 的 path 仓库机制只负责“指向源码目录”,不监控本地包的 composer.json 里 require 或 autoload 的变化。哪怕你本地包新增了一个 monolog/monolog 依赖,主项目运行时也不会自动加载它——因为 autoload 映射没重生成,vendor 中也没有该包的副本。
- 主项目
vendor/autoload.php不会感知本地包依赖变更,必须手动触发composer dump-autoload - 本地包新增的第三方依赖(如
"phpunit/phpunit": "^10")不会被主项目自动安装,composer install仍只按主项目的composer.json执行 - 若本地包删了某个依赖,主项目
vendor/下残留的旧包不会被自动清理,可能引发冲突或误用
依赖变更后必须跑的两条命令
改完本地包的 composer.json(无论是增删 require、调整 autoload,还是改 minimum-stability),回到主项目根目录执行:
-
composer update vendor/name --with-dependencies:强制重新解析并安装本地包及其所有新依赖(--with-dependencies是关键,否则只更新包本身) -
composer dump-autoload:刷新整个项目的自动加载映射,确保新引入的类能被找到;如果本地包加了autoload-dev,还要加--dev
注意:composer update vendor/name 单独执行是不够的——它默认跳过依赖树中已满足约束的包,容易漏掉本地包新声明的依赖。
为什么 composer install 不行?
composer install 完全依赖 composer.lock,而这个文件在你改本地包时根本没变。即使本地包 composer.json 已新增依赖,install 也只会还原 lock 文件里记录的老状态。
- 除非你先运行
composer update vendor/name触发 lock 文件更新,否则install永远不会拉新依赖 - 如果你在 CI/CD 流程中用了
install,务必确认前一步是否已执行过带--with-dependencies的update - 本地开发时,可把这两步写成脚本:
#!/bin/sh; composer update vendor/name --with-dependencies && composer dump-autoload
容易被忽略的 autoload 细节
本地包的 PSR-4 映射不会“继承”到主项目,但它的命名空间路径会被合并进主项目的 autoload map。一旦你改了本地包的 "autoload": {"psr-4": {"Acme\": "src/"}},就必须重跑 dump-autoload,否则 new AcmeFoo() 会报 Class not found。
- 验证是否生效:检查
vendor/composer/autoload_psr4.php里是否有你新加的映射项 - 如果本地包用了
classmap,记得加--optimize-autoloader参数提升性能 - Windows 下若看到
Warning: require(...): failed to open stream,大概率是 autoload 没刷新,不是路径问题
composer.json 后 reload 一下浏览器就生效了。


















