composer没有“增量更新”原生概念,所谓增量实为精准控制更新范围;唯一可靠命令是composer update vendor/package-name,它仅更新目标包及其直系依赖,不重算整棵依赖树。

Composer 没有“增量更新”这个原生概念,所谓“增量”,只是通过精准控制命令范围,避免重算整棵依赖树——最可靠的做法就是 composer update vendor/package-name,其他带参数的变体反而容易误触发过度更新。
为什么 composer update vendor/package 才是真·局部更新
它只动三样东西:目标包自身、它在 composer.json 中声明的直系依赖(require)、以及这些直系依赖中尚未被其他顶层包锁死的版本。其余所有包,包括 laravel/framework、phpunit/phpunit,哪怕也在 composer.json 里,也完全不动。
-
composer update不加参数会丢弃composer.lock当前状态,重新解析整个composer.json,极易引入静默 break - 执行后发现无关包也变了?先
git diff composer.lock看变的是谁:如果是psr/log或symfony/polyfill-php80,正常;如果是guzzlehttp/guzzle,大概率你输成了composer update(漏了包名)或用了带空格的引号导致 shell 忽略参数 -
composer update monolog/monolog永远不会从^2.8升到^3.0——它严格遵守composer.json里的约束。要升主版本,必须先手动改约束,再运行带包名的update
--with-dependencies 和 --with-all-dependencies 到底该用哪个
这两个参数不是“开关”,而是“扩大 solver 作用域”的标记。是否真更新,仍取决于版本约束和 composer.lock 状态。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--with-dependencies:只把目标包的 一级依赖(即它composer.json的require列表)加入本次求解范围,不递归 -
--with-all-dependencies:把目标包及其所有层级的依赖都纳入求解,但依然受composer.json约束限制,不会跨主版本 - 空参数下运行
composer update --with-all-dependencies等价于composer update,不是“更深度”,而是“全量重算”,性能更差、冲突风险更高 - CI 中无条件加
--with-dependencies容易导致间接依赖漂移,破坏可重现性
大项目提速的关键配置项
Composer 2.9.6 默认已启用并发下载,但多数人没确认是否真正生效。提速不靠玄学,靠验证和清理。
- 先确认版本:
composer --version输出必须是2.1.x或更高;低于此版本不支持原生并发 - 换国内镜像源(必做):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,换完立刻composer clear-cache - 调并发数:
composer config -g http-max-concurrent-downloads 8(设 10 容易触发临时文件竞争) - 禁用 Xdebug:
php -d xdebug.mode=off $(which composer) update,Xdebug 会让 Composer 执行慢 3–5 倍 -
composer install比update快得多,生产环境永远优先用install;开发中想升包,先composer outdated --direct看哪些是你亲手写的包,再逐个update
最容易被忽略的细节:包必须是直连依赖
执行 composer update foo/bar 报错 Package foo/bar is not required in your composer.json,说明它只是某个包的子依赖(transitive dependency),没被你项目直接 require。这时候不能硬上,得先查清来源:composer depends foo/bar,再决定是升级上游包,还是把它显式加进 composer.json。
另外,升级后类找不到,90% 是 autoload 没刷新,不是包没装对。尤其开了 "optimize-autoloader": true,旧缓存会顽固残留,必须补一句 composer dump-autoload -o。










