离线执行composer install报错的根本原因是composer默认拒绝使用本地文件,必须显式设置composer_disable_network=1并确保vendor/、composer.lock、composer.json完整拷贝且php环境匹配。

离线部署时 composer install 报错,基本不是命令写错了,而是“没把东西带全”或“环境没对齐”。核心矛盾就一个:Composer 默认拒绝用本地已有文件,除非你明确告诉它“别联网、信我给的”。
为什么离线执行 composer install 会报 Could not fetch packages
因为 Composer 在离线机上默认行为是:先尝试联网拉 packages.json 元数据,再按需下载 ZIP 包。哪怕你已经拷了 vendor/ 和 composer.lock,它也不会自动跳过网络请求——它宁可报错,也不愿猜你是不是真有缓存。
- 不设
COMPOSER_DISABLE_NETWORK=1,所有离线操作都可能失败 -
composer install不是“解压 vendor”,而是“校验 lock → 检查 vendor 是否完整 → 缺啥补啥”,所以空vendor/是安全起点,残留旧包反而容易冲突 - 报错里出现
https://packagist.org或repo.packagist.org就说明它还在试图联网,根本没进离线逻辑
打包依赖必须包含哪几个东西?
只拷 vendor/ 是最常见错误。真正要打包的,是能构成“可验证快照”的最小集合:
-
composer.lock(必须,且和线上生成时完全一致) -
composer.json(含config.platform.php等平台约束) -
vendor/目录(全量,包括.gitignore里忽略的文件,比如autoload.php的生成结果) - 如果用了私有包,还得带上对应
path仓库的源码目录,并确保composer.json里声明了"type": "path"
注意:composer.lock 里记录的是每个包的 dist.url 和 dist.shasum,只要这些 ZIP 文件在 vendor/ 里已解压好,composer install 就不会再去下载。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
离线机上执行前必须检查三件事
即使包拷全了、环境变量也设了,仍可能失败。关键卡点往往藏在 PHP 层:
-
php -v输出版本必须 ≥composer.lock中任意包的require.php声明(例如某包 require php >=8.2,而离线机是 8.1,就会直接退出) - 必须启用
ext-zip(解压 dist 包必需)、ext-json(解析 lock 文件)、ext-openssl(校验 shasum) -
vendor/目录属主必须和运行composer install的用户一致;如果之前用sudo生成过,现在普通用户执行就会报Permission denied
验证方式:运行 php -m | grep -E "^(zip|json|openssl)$",再用 ls -ld vendor/ 看属主是否匹配当前用户。
遇到 Class not found 却没网络报错?
这说明 composer install 成功跑完了,但 autoloader 没生效——问题不在依赖下载,而在加载路径或权限:
-
vendor/autoload.php是否存在?不存在说明composer install没真正完成(可能中途被信号中断) -
vendor/composer/autoload_static.php是否可读?若属主是 root,当前用户无读权限,require就会静默失败 - 项目里是否手动修改过
vendor/autoload.php?一旦被覆盖,dump-autoload 无法恢复,得重装
最稳妥做法:离线机上删掉整个 vendor/,再跑一遍 COMPOSER_DISABLE_NETWORK=1 composer install --no-dev --no-scripts,别图省事复用旧 vendor/。










