composer install 读取 composer.lock 文件(若存在)并严格按其安装依赖;若无 lock 文件,则解析 composer.json 生成新 lock 后安装。

composer install 读取的是哪个文件?
composer install 默认只认项目根目录下的 composer.json,它不会自动加载子目录或重命名的配置文件。如果该文件不存在,命令直接报错:No composer.json found in the current directory。
注意:它不解析 composer.lock 来决定装什么——而是先检查是否存在 composer.lock,有则按锁文件精确安装;没有则根据 composer.json 解析依赖树、生成新锁文件再安装。
为什么有时候运行 install 没反应,或者装了旧版本?
常见原因不是命令写错,而是配置和状态不匹配:
- 已有
composer.lock但你刚手动改过composer.json的require字段?install仍会按锁文件装,不会理会 JSON 里的新改动 - 想升级某个包却只改了
composer.json版本号,没运行composer update vendor/package?那install不会生效 -
composer.json里写了"minimum-stability": "dev",但composer.lock锁的是stable版本?此时install仍装 stable,因为锁文件优先级更高
autoload 配置在 install 过程中起什么作用?
composer install 本身不执行自动加载逻辑,但它会触发 vendor/autoload.php 的重建——前提是 composer.json 中定义了 autoload 字段。
例如这个配置:
{
"autoload": {
"psr-4": {
"App\": "src/"
},
"classmap": ["legacy/"]
}
}
执行 composer install 后,vendor/autoload.php 就能正确映射 AppFoo 到 src/Foo.php,也能把 legacy/Helper.php 里的全局函数纳入加载范围。但注意:classmap 路径下新增文件后,必须再跑一次 composer dump-autoload 才生效,install 不会自动帮你扫目录。
生产环境部署时,install 的行为差异在哪?
线上服务器上建议加两个参数:
-
--no-dev:跳过require-dev里的包(如 phpunit、phpstan),减小体积、避免误用 -
--optimize-autoloader:生成扁平化类映射(vendor/composer/autoload_classmap.php),提升 PSR-4 类加载速度,尤其对大量小类的项目明显
这两个参数不影响 composer.json 结构,但会改变 vendor/ 下生成的加载器内容。漏掉 --optimize-autoloader 是很多老项目上线后 autoload 性能差的隐藏原因。











