composer install 默认复用 vendor 中匹配 composer.lock 的包,不重装已存在且版本一致的依赖;若版本或校验值不符则删除重装,非跳过而是校准。

composer install 时跳过下载,复用现有 vendor
直接运行 composer install 就行——它默认不重装已有包,只按 composer.lock 精确还原依赖树。前提是 vendor/ 里已存在对应版本的包,且 composer.lock 没变。
常见错误现象:composer update 被误用,导致所有包升级、重新下载;或删了 vendor/ 却没删 composer.lock,再跑 install 反而全量重拉。
- 必须确保
composer.lock文件存在且未被修改(比如 git checkout 后没覆盖本地 lock) - 如果
vendor/里有包但版本和 lock 不符,install会删掉旧版、重装匹配版——不是“跳过”,而是“校准” -
composer install --no-install是无效命令;--no-scripts或--no-plugins不影响下载行为
为什么 vendor 里有包,composer install 还是重下?
本质是版本对不上:Composer 不看文件是否存在,只比对 composer.lock 中记录的 hash 和 vendor/ 下实际安装包的 hash(或 dist zip 的校验值)。哪怕只是改了一行 README,hash 就失效。
使用场景:CI 构建中想缓存 vendor 目录,但每次仍重下——大概率是 lock 文件在构建过程中被更新(比如有人提交了新 lock),或缓存没带 lock 一起恢复。
- 检查
composer.lock时间戳和内容是否与预期一致(git status composer.lock) - 运行
composer install -v,看输出里是否有Installing xxx (1.2.3)——有就说明在装,不是跳过 - 用
composer show xxx查看已安装版本,对比 lock 里该包的version和dist/shasum
想彻底禁用网络,强制用 vendor 里的东西
没有“强制离线模式”。Composer 设计上不支持跳过校验硬用旧文件——这是安全机制,防止篡改或损坏包被忽略。
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。《php中级教程之ajax技术》带你快速
但可绕过网络请求:用 --no-network 参数,配合本地已有的完整 vendor + 匹配 lock,能避免任何 HTTP 调用。
-
composer install --no-network:断网时若 vendor 和 lock 匹配,会成功;不匹配则报错退出,不会 fallback 到网络 - 不能和
--ignore-platform-reqs混用——后者解决扩展缺失问题,和网络无关 - 注意:某些插件(如
hirak/prestissimo)可能干扰离线行为,建议干净环境测试
vendor 目录结构被手动改过,还能复用吗?
不能。Composer 把 vendor/ 当作完全受控目录,任何手动增删改(比如 cp 一个包进去、mv 改名、touch 写文件)都会破坏其内部状态。
典型症状:执行 composer install 后报 Package xxx is not installed,或后续 autoload 找不到类。
- 唯一安全的手动操作是整个删除
vendor/,再让 Composer 重建 - 若想“预填充” vendor(如内网部署),应使用
composer install --prefer-dist+ 提前下载好 dist 包到~/.composer/cache/files/,而非直接塞进 vendor - 自定义 autoloader 或 symlink 入口,别动 vendor 下的包目录结构
最常被忽略的一点:lock 文件里记录的是 dist 包的 shasum,不是 source 的 commit hash;所以即使你用 git clone 了一个包放进去,只要没走 Composer 安装流程,它就不认。









