composer 默认在当前工作目录安装依赖,创建 vendor 文件夹并读取该目录下的 composer.json;若在子目录执行且无 composer.json 则报错,有则仅影响该子目录。

composer install 默认装到哪?为什么子目录里执行会报错
Composer 不是“安装到子目录”的工具,它默认在当前工作目录下创建 vendor、读取 composer.json、写入 composer.lock。你在子目录里直接运行 composer install,它就只管这个子目录——如果这里没有 composer.json,就会报 Could not find a composer.json file;如果有,那所有依赖也只装进这个子目录的 vendor,和项目根目录完全无关。
常见错误现象:
- 在
./web/下执行composer install,结果vendor出现在./web/vendor,但autoload.php被上层入口(如./index.php)引用,导致类找不到 - 误以为改了
COMPOSER_HOME就能切换项目根路径——其实那只是缓存和全局配置位置,不影响单个项目行为
想让 vendor 装在父目录,就得让 composer 在父目录运行
核心原则:composer 的作用域 = 当前命令执行时所在的目录。不是靠配置“指定根”,而是靠你 cd 到哪、在哪敲命令。
实操建议:
- 始终在项目根目录(即含
composer.json的目录)下运行composer install或composer update - 如果 Web 入口必须放在子目录(比如
public/或web/),那就用相对路径加载 autoload:require __DIR__.'/../vendor/autoload.php'; - 不要在子目录里初始化新项目(
composer init),除非你真打算把那个子目录当成独立包来维护
composer.json 里能改 vendor 路径吗?可以,但别乱动
能,通过 "config": { "vendor-dir": "path/to/vendor" },但这是危险操作。
为什么慎用:
- 路径是相对于
composer.json所在目录的,设成"../vendor"看似可行,但一旦有人在其他目录执行 composer 命令(比如 CI 脚本 pwd 不对),vendor 就可能被写到意外位置 - 某些插件或脚本(如
phpstan、larastan)会硬编码找vendor/autoload.php,改了路径就得同步改一堆地方 - Git 忽略规则、部署脚本、Docker COPY 指令都得跟着调,容易漏
真要改,只在明确需要隔离 vendor(如共享主机多项目共用一份依赖)且能统一控制执行环境时考虑,普通项目没必要。
部署时子目录结构混乱?重点检查 autoload 和自动加载逻辑
很多问题表面是“装在哪”,实际是“怎么加载”。Composer 生成的 vendor/autoload.php 本身不关心自己在哪,它只按 composer.json 中的 autoload 规则注册命名空间和文件映射。
关键检查点:
- 确认入口文件(如
public/index.php)中 require 的路径正确,用__DIR__向上跳转比写死相对路径更稳 - 运行
composer dump-autoload -o确保优化后的 autoloader 生效,避免开发环境 OK、生产环境类找不到 - 如果用了 PSR-4 自动加载,检查
composer.json里"psr-4"的 namespace 和路径是否匹配真实目录结构,大小写敏感(尤其 Linux 服务器)
最常被忽略的是:本地测试时 Web 服务器 DocumentRoot 指向项目根,上线后却指向子目录,导致 __DIR__ 基准变了,autoload 路径就断了——这种问题不会报 composer 错,但会静默失败。










