composer离线安装需同时执行--no-network和确保composer.lock存在且未修改,否则仍会联网;autoload.php失效常因路径错误、映射配置错误或未运行dump-autoload。

composer install 时提示“Could not fetch packages”但你确有 vendor 目录
这说明 Composer 默认仍尝试联网校验或更新,哪怕 vendor 已存在。它不自动 fallback 到本地 autoload,因为 autoload.php 是运行时依赖,不是安装逻辑的一部分。
真正要解决的,是让 composer install 完全跳过网络请求,只基于 composer.lock 和已有 vendor 重建 autoloader —— 这需要两个动作同时生效:
- 加
--no-network:禁止所有远程请求(包括 packagist 查询、git clone、zip 下载) - 加
--no-install或配合--no-scripts?不对 —— 正确组合是--no-network --prefer-source?也不对。实际最稳的是:--no-network --no-progress --no-suggest,但核心必须配--ignore-platform-reqs(如果本地 PHP 版本与 lock 文件不一致,否则会卡在平台检查) - 最关键一步:确保
composer.lock文件存在且未被修改,否则 Composer 会尝试重新解析依赖图,触发网络行为
为什么 require_once 'vendor/autoload.php' 在无网时仍报错 Class not found
这不是 Composer 安装问题,而是 autoloader 本身没加载到类 —— 常见于路径错误或 vendor/autoload.php 被破坏。
检查三件事:
立即学习“PHP免费学习笔记(深入)”;
-
vendor/autoload.php文件是否真实存在且可读(权限、大小非 0) - 你的
require_once路径是否写死为相对路径,比如require_once 'vendor/autoload.php',但当前工作目录不是项目根?换成require_once __DIR__ . '/vendor/autoload.php' -
composer dump-autoload -o是否执行过?优化后的 autoloader(vendor/composer/autoload_classmap.php等)更健壮;没优化时,某些 PSR-4 映射可能因目录结构变动失效
离线部署时如何确保 vendor/autoload.php 可靠生效
不要依赖「上次 install 留下的 vendor」,离线环境必须预验证 autoload 的完整性。
上线前在有网机器上做三件事:
- 运行
composer install --no-dev --optimize-autoloader --no-interaction,生成压缩版 classmap - 用
composer show --installed输出依赖列表,存为deps.txt,离线时比对是否缺失 - 手动测试 autoload:运行
php -r "require 'vendor/autoload.php'; echo class_exists('Monolog\Logger') ? 'ok' : 'fail';",确认关键类能加载
这些步骤不能省,因为 autoload.php 是动态生成的,内容取决于 composer.json + lock + 当前 vendor 文件树,三者稍有不一致就 silently 失效。
常见错误现象:Composer 报 “Package x is not installed” 却明明在 vendor 里
典型表现是 composer dump-autoload 成功,但运行时报 Class 'Some\Class' not found,而 ls vendor/some/package/src/ 确实存在对应文件。
原因通常是:
- PSR-4 映射路径在
composer.json中写错了(比如多了一级src/,但实际代码在lib/),导致 autoloader 不扫描该目录 -
vendor/composer/autoload_psr4.php缓存了旧映射,删掉整个vendor/composer/目录再composer dump-autoload才生效 - 使用了
classmap方式但没运行composer dump-autoload -a,导致新增类未被收录
离线时没法重装包,只能靠修正映射和重生成 autoload —— 所以 composer.json 的 autoload 配置必须在有网时就调通,不能留到离线再试。











