composer如何通过U盘转移依赖到目标机器?

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

composer如何通过U盘转移依赖到目标机器?

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 核对。