composer install 默认复用 vendor 中匹配 composer.lock 的包,不重装已存在且版本一致的依赖;若版本或校验值不符则删除重装,非跳过而是校准。
composer
install 时跳过下载,复用现有 vendor
直接运行
就行——它默认不重装已有包,只按
精确还原依赖树。前提是
里已存在对应版本的包,且
没变。
常见错误现象:
被误用,导致所有包升级、重新下载;或删了
却没删
,再跑
反而全量重拉。
必须确保
文件存在且未被修改(比如 git checkout 后没覆盖本地 lock)
如果
里有包但版本和 lock 不符,
会删掉旧版、重装匹配版——不是“跳过”,而是“校准”
是无效命令;
或
不影响下载行为
为什么 vendor 里有包,composer install 还是重下?
本质是版本对不上:Composer 不看文件是否存在,只比对
中记录的 hash 和
下实际安装包的 hash(或 dist zip 的校验值)。哪怕只是改了一行 README,hash 就失效。
使用场景:CI 构建中想缓存 vendor 目录,但每次仍重下——大概率是 lock 文件在构建过程中被更新(比如有人提交了新 lock),或缓存没带 lock 一起恢复。
检查
时间戳和内容是否与预期一致(
)
运行
,看输出里是否有
——有就说明在装,不是跳过
用
查看已安装版本,对比 lock 里该包的
和
想彻底禁用网络,强制用 vendor 里的东西
没有“强制离线模式”。Composer 设计上不支持跳过校验硬用旧文件——这是安全机制,防止篡改或损坏包被忽略。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
但可绕过网络请求:用
参数,配合本地已有的完整 vendor + 匹配 lock,能避免任何 HTTP 调用。
:断网时若 vendor 和 lock 匹配,会成功;不匹配则报错退出,不会 fallback 到网络
不能和
混用——后者解决扩展缺失问题,和网络无关
注意:某些插件(如
)可能干扰离线行为,建议干净环境测试
vendor 目录结构被手动改过,还能复用吗?
不能。Composer 把
当作完全受控目录,任何手动增删改(比如 cp 一个包进去、mv 改名、touch 写文件)都会破坏其内部状态。
典型症状:执行
后报
,或后续
找不到类。
唯一安全的手动操作是整个删除
,再让 Composer 重建
若想“预填充” vendor(如内网部署),应使用
+ 提前下载好 dist 包到
,而非直接塞进 vendor
自定义 autoloader 或 symlink 入口,别动 vendor 下的包目录结构
最常被忽略的一点:lock 文件里记录的是 dist 包的 shasum,不是 source 的 commit hash;所以即使你用 git clone 了一个包放进去,只要没走 Composer 安装流程,它就不认。
composer installcomposer.lockvendor/composer.lockcomposer updatevendor/composer.lockinstallcomposer.lockvendor/installcomposer install --no-install--no-scripts--no-pluginscomposer.lockvendor/composer.lockgit status composer.lockcomposer install -vInstalling xxx (1.2.3)composer show xxxversiondist/shasum--no-networkcomposer install --no-network--ignore-platform-reqshirak/prestissimovendor/composer installPackage xxx is not installedautoloadvendor/composer install --prefer-dist~/.composer/cache/files/