不行,直接复制 vendor 目录会导致 composer install 报错或覆盖包;正确离线方案是使用 composer install --repository-url=file:// 指向本地 zip 包仓库,并确保 composer.lock 完整匹配。

直接把 vendor 目录复制过来行不行?
不行,composer install 会校验 composer.lock 和已安装包的版本、哈希值是否匹配。直接复制 vendor/ 可能导致:composer install 报错 Package directory ... is not empty,或后续 composer update 强制重装、覆盖你手动放进去的包。
用 composer install --no-scripts --no-plugins 跳过校验?
不能跳过核心校验。这个参数只跳过脚本执行和插件加载,不跳过包完整性检查。真正起作用的是:composer install --ignore-platform-reqs(仅绕过 PHP 扩展依赖)或更关键的:composer install --prefer-dist(默认行为),但它仍依赖 composer.lock 中记录的源信息。
所以前提必须是:你已有完整、匹配的 composer.lock 文件,且目标机器能访问包源(Packagist 或私仓)。否则 Composer 无法确认「已下载的依赖」是否就是 lock 文件所指的那一版。
本地离线导入:用 composer install --repository-url=file://
这是最可控的离线方案,适用于你已用 composer install --prefer-dist 下好所有 .zip 包(在 vendor/composer/archives/),或手动下载了对应 .zip 放到某个目录。
- 把所有
.zip包放进一个空文件夹,比如/path/to/local-repo/ - 运行:
composer install --repository-url=file:///path/to/local-repo/ --prefer-dist - 确保
composer.json中没有强制指定dist的type或url,否则会忽略本地仓库 - 注意路径末尾斜杠和
file://协议写法,Windows 下要用file:///C:/path/to/repo(三个斜杠)
为什么不用 composer require 逐个加?
因为 composer require 会修改 composer.json 和 composer.lock,触发远程解析与版本决策——这违背「导入已下载包」的初衷。它适合新增依赖,不适合还原现场。
真正的离线还原只有两条路:一是用完整的 vendor/ + composer.lock + composer install --no-install(其实没这个参数,别信网上乱传);二是走本地仓库模式,让 Composer 认为那些 zip 就是官方分发包。
最容易被忽略的一点:Composer 不关心你硬盘上有没有那个文件夹,它只认 composer.lock 里的 hash 和 dist URL。想绕过网络,就得让它“以为”那些 URL 指向你本地的文件。










