composer require --dev 会完整重生成 composer.lock,重新解析全部依赖而非仅修改 require-dev;手动编辑 composer.json 后需显式运行 install 或 update,且 dev 包信息始终存在于 lock 文件中。
require --dev 会触发 lock 文件的完整重生成
执行
不只是往
的
区块加一行,它会立即运行依赖解析器,重新计算整个依赖图(包括
和
),然后重写
—— 即使你只加了一个小工具包,也可能导致几十个包的版本微调(比如从
锁定到
或回退到
)。
常见错误现象:
• 本地
手动加了
,但没运行
,CI 构建失败(因为
里没这条记录)
• 团队成员各自手动改
后直接
,结果
没同步更新,合入后 CI 报 “package not found”
是原子操作:修改 JSON + 解析依赖 + 更新 LOCK
手动编辑
只是“声明意图”,不改变实际安装状态
后续必须显式运行
或
才能生效(且行为不同,见下一条)
手动改
composer
.
js
on 后该用 install 还是 update?
关键区别在于是否信任现有
:
如果只是追加一个新 dev 包,且确认其他依赖版本无需变动 → 用
(它会严格按
安装,**不会**重新解析依赖)
如果新增包可能和已有包冲突,或你想让 Composer 重新协调所有版本 → 用
(它会忽略
,重新跑 solver,再写新
)
更安全的做法是:手动改完
后,运行
先看会动哪些包,再决定是否真执行
注意:
在没有
时会自动 fallback 到
行为 —— 这也是为什么首次克隆项目后要先
而不是
。
dev 依赖对生产环境的影响(lock 文件视角)
文件本身**总是包含全部依赖**(
+
),无论你用
还是
安装。区别只在
阶段是否跳过安装
下的包。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
:读取
中所有包信息,但只安装
列表里的包(
的包不下载、不解压、不写入
)
里仍保留 dev 包的哈希、版本、source URL 等元数据 —— 这是为了保证
和
基于同一份确定性快照
所以,即使你在生产环境用
,只要
里有 dev 包记录,CI 就能复现完全一致的依赖解析过程
为什么有时 require --dev 会升级非 dev 包?
因为 Composer 的依赖求解器不区分“主依赖”和“开发依赖”的优先级 —— 它把整个
当作一个约束集来解。例如:
而
可能要求
,后者又要求
,而这个
的
版本与
兼容,但
版本锁的是
—— solver 就可能把
也升到
来满足整体一致性。
这就是为什么不能假设
操作“只影响 dev 区块”。真正隔离变更的唯一方式是:
用
先写 JSON
再用
(仅更新该包及其子依赖)
避免全局
导致意外漂移
lock 文件的精确性,取决于你控制求解范围的粒度,而不是“dev”这个标签本身。
composer require --devcomposer.jsonrequire-devrequirerequire-devcomposer.lock^2.1.02.1.32.0.9composer.json"phpunit/phpunit": "^10.5"composer installcomposer.lockcomposer.jsongit commitcomposer.lockcomposer require --devcomposer.jsoncomposer installcomposer updatecomposer.lockcomposer installlockcomposer updatelocklockcomposer.jsoncomposer update --dry-runcomposer installcomposer.lockupdateinstallrequirecomposer.lockrequirerequire-dev--no-dev--productioninstallrequire-devcomposer install --no-devlockrequirerequire-devvendor/autoload.phpcomposer.lockinstall --no-devinstall--no-devcomposer.lockcomposer.json
"require": {
"monolog/monolog": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^10.5"
}
phpunit/phpunit ^10.5phpunit/php-code-coverage ^10.1sebastian/version ^4.0sebastian/version4.0monolog/monolog ^3.03.0sebastian/version ^3.0monolog3.1.0--devcomposer require --dev --no-updatecomposer update phpunit/phpunit --with-all-dependenciesupdate