Composer install适用于新项目拉取、CI/CD部署和线上发布,而composer update仅用于本地开发加依赖或升级小版本;二者误用会导致lock文件不一致与兼容性问题。

Composer 不是“学完再用”的工具,它是边跑边调、出错即修的基础设施。你只要能执行 composer require 并成功 require_once 'vendor/autoload.php',就已经跨过了 80% 的门槛——剩下的是对约束条件的理解,不是语法记忆。
composer install 和 composer update 到底该用哪个
新项目首次拉代码、CI/CD 部署、线上发布,必须用 composer install;本地开发加依赖、主动升级小版本,才用 composer update。
常见错误现象:
- 团队里有人运行了
composer update后提交了新的composer.lock,其他人install出来行为不一致,但没人意识到是 lock 文件被悄悄改了 - 直接删掉
vendor和composer.lock,只留composer.json就跑update,结果装了一堆新版包,引发兼容性崩溃
使用场景判断很简单:
- 你刚
git clone一个别人写的项目 → 无脑composer install - 你要加一个新包,比如日志组件 → 先
composer require monolog/monolog(它自动update并更新lock) - 你想把所有包升到最新小版本(如
2.1.3→2.1.9)→composer update --with-dependencies,别裸跑update
vendor/autoload.php 必须用绝对路径引入
这是最常被忽略的加载安全点:入口文件第一行必须是 require __DIR__ . '/vendor/autoload.php';,而不是 ./vendor/autoload.php 或硬编码相对路径。
容易踩的坑:
- 在
index.php里写require 'vendor/autoload.php';,一挪目录或通过 CLI 调用就报Class not found - 误以为
autoload.php是“可选的”,自己手写require_once 'vendor/monolog/monolog/src/Monolog/Logger.php';,结果 Monolog 内部又依赖其他类,全得手动补 - 用了自定义
"autoload"配置但没执行composer dump-autoload,改了命名空间映射却不生效
正确做法就一条:所有 PHP 入口(index.php、cli.php、phpunit 启动脚本)第一行必须是 require __DIR__ . '/vendor/autoload.php';。
国内网络下 composer install 卡在 “Loading composer repositories”
这不是你网络断了,也不是 Composer 坏了,是 Packagist 官方源(https://packagist.org)被墙导致的典型现象,直连基本超时。
解决方式只有换镜像源,且必须全局或项目级配置,不能靠“多试几次”:
- 全局换(推荐):
composer config -g repo.packagist composer https://packagist.phpcomposer.com - 项目级换:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/ - 验证是否生效:运行
composer config -g repo.packagist,输出应为镜像地址而非https://packagist.org
注意:阿里云、腾讯云、华为云镜像均已支持 HTTPS + 语义化版本解析,无需降级到 HTTP 源。
composer.json 里 autoload 配置写错就等于没 autoload
很多老项目迁移 Composer 时卡在这一步:写了 "autoload": { "psr-4": { "App\": "src/" } },但类还是找不到——因为反斜杠没转义或路径不存在。
关键细节:
-
psr-4的命名空间末尾必须带双反斜杠\,写成"App":"src/"会解析失败 - 路径是相对于
composer.json所在目录的,"src/"意味着项目根目录下要有src/子目录 - 如果项目是老式无命名空间代码,改用
"classmap": ["lib/", "includes/"]更稳妥,然后运行composer dump-autoload - 改完
composer.json后,必须手动触发composer dump-autoload,否则改动不生效
真正难的不是写对这行 JSON,而是理解:Composer 的自动加载不是魔法,它只是把命名空间字符串映射成磁盘路径的一张表——表错了,就找不到类。











