正确做法是用 composer install --no-scripts --no-plugins --no-dev 跳过远程解析,配合 --prefer-dist 和完整拷贝 composer.lock 实现离线安装,并重生成 autoload 与修复权限。

composer install 时提示 “Package X not found” 但本地有 vendor
目标机器没网络,U 盘拷了 vendor 目录过去,直接运行 composer install 会失败——因为 Composer 默认忽略已存在的 vendor,转而查 packagist.org,而目标机根本连不上。
正确做法是跳过远程包解析,强制复用现有依赖:
- 确保 U 盘里的
vendor是用和目标机**完全一致的 PHP 版本、Composer 版本、平台架构(如 Linux x64)** 生成的;混合环境大概率因扩展缺失或二进制不兼容报错 - 在目标机执行:
composer install --no-scripts --no-plugins --no-dev,这能绕过脚本执行和插件加载,减少环境差异引发的崩溃 - 如果项目用了
platform配置(如"ext-gd": "8.1.0"),务必确认目标机实际安装的扩展版本匹配,否则composer install仍会拒绝继续
vendor 目录拷贝后 autoload 失效
常见现象:PHP 报错 Class 'MonologLogger' not found,即使 vendor/monolog/monolog 确实存在。根源是 vendor/autoload.php 里写的路径是源机器的绝对路径(尤其 Windows 拷到 Linux 时更明显)。
必须重生成 autoloader:
- 在目标机进入项目根目录,运行:
composer dump-autoload --optimize(或简写composer du -o) - 不要加
--classmap-authoritative,除非你确认所有类都已被扫描进 classmap——U 盘迁移后未执行过完整 autoload 生成,贸然启用会导致漏类 - 若项目含自定义 autoload 规则(如
"psr-4": {"App\": "src/"}),检查src/路径是否存在且权限可读,Linux 下常因 U 盘挂载为 noexec 或权限丢失导致 require 失败
如何让 composer install 完全离线不联网
哪怕只差一个包,composer install 也会尝试访问网络。想彻底断网运行,得提前在源机器“冻结”全部依赖信息:
- 在源机器执行:
composer install --no-dev --prefer-dist --optimize-autoloader,然后立刻运行:composer archive --format=zip --dir=dist/ my-app(可选,用于打包验证) - 关键一步:把源机器的
composer.lock文件一起拷到 U 盘——它记录了每个包的确切 commit hash 或 dist URL,目标机靠它锁定版本,不查最新版 - 目标机首次运行前,先删掉已有
vendor(避免混入旧缓存),再执行:composer install --no-interaction --no-progress --prefer-dist;--no-interaction防止卡在确认提示,--prefer-dist确保走压缩包路径而非源码克隆
Windows 打包后 Linux 运行失败的典型原因
U 盘在 Windows 下格式化为 NTFS/FAT32,拷贝到 Linux 后常出现两类问题:
- 文件权限丢失:
vendor/bin/phpunit变成不可执行,运行时报Permission denied;解决:在目标机执行chmod +x vendor/bin/*(仅限 bin 下脚本) - 换行符与扩展名敏感:
composer.json若被 Windows 编辑器保存为 CRLF,部分旧版 Composer 解析失败;用dos2unix composer.json修复(需提前装好dos2unix包) - 大小写问题:Windows 不区分
Vendor/和vendor/,但 Linux 严格区分;确保 U 盘上目录名全小写,且composer.json中"vendor-dir"配置(如有)也写成小写
最麻烦的其实是扩展依赖:比如 ext-sodium 在 PHP 7.2+ 是内置的,但某些定制编译的 PHP 可能禁用它——这种问题不会在 composer install 阶段暴露,而要等运行时才崩,得提前在目标机跑 php -m | grep sodium 核对。










