执行 composer init 后没有 vendor 目录完全正常,因 init 仅生成 composer.json 配置文件,不安装依赖、不创建 vendor 目录;真正触发下载和生成的是 composer install 或 composer require。

执行 composer init 后没有 vendor 目录,是完全正常的——init 只生成 composer.json,不安装任何包,也不创建 vendor。真正触发依赖下载和目录生成的,是 composer install 或 composer require。
为什么 composer init 不生成 vendor
composer init 是交互式配置文件生成器,它只做一件事:帮你写好 composer.json。这个文件里即使写了 "require": {"monolog/monolog": "^3.0"},也仅仅是“声明”,不是“执行”。Composer 不会自动去拉包,就像写了个购物清单不等于快递已到家。
-
composer.json是契约,不是指令;install和require才是履约动作 - 如果
composer.json里require是空的(常见于初始交互),install会直接退出,不建vendor - 执行
init后立刻检查vendor是否存在,属于典型的时间错配——还没下单,就问货到了没
执行完 init 后必须做的三件事
缺一不可,顺序不能乱:
- 确认
composer.json中require字段已填入至少一个包(比如"php": ">=8.1"是平台要求,不算依赖;得有类似"symfony/console": "^6.4"这种第三方包) - 运行
composer install—— 它会读composer.lock(若存在)或按composer.json解析并生成新 lock,然后下载、解压、写入vendor - 检查是否生成了
vendor/autoload.php;没这个文件,后续require 'vendor/autoload.php'就会报Fatal error: Uncaught Error: Failed opening required
常见错误现象与对应操作
不是命令不会用,而是状态没理清:
- 执行
composer install后vendor仍为空:先ls -la看有没有composer.lock;没有,说明init没填依赖,或填了但没保存;有,再看cat composer.lock | head -5是否含"packages"字段 - 报错
Your requirements could not be resolved:大概率是php版本不满足某个包的require.php声明,用php -v和composer show --platform php对比 -
vendor/autoload.php存在但类仍not found:运行composer dump-autoload强制重生成映射,尤其当你手动改过psr-4配置却忘了刷新 - 误把
composer.json.dist当成正式配置:它只是模板,必须重命名为composer.json,否则install完全无视
容易被忽略的细节
最麻烦的不是没跑对命令,而是环境隐式不一致:
-
composer install默认只装require,不装require-dev;如果你的自动加载规则(如 PSR-4)写在autoload-dev里,又没加--dev参数,dump-autoload就不会包含那些路径 - 某些框架(如 Laravel)的
create-project命令内部已封装install,但init+install是裸流程,没任何魔法——你得自己确保 PHP 扩展(如openssl、zip)已启用,否则下载或解压阶段静默失败 -
vendor目录权限问题常被归为“网络错误”:Linux/macOS 下若项目在挂载卷(如 Docker sync、WSL2 跨文件系统),chmod可能失效,此时composer install --no-scripts能绕过部分权限敏感脚本,先落地文件











