composer require 是安装 PHP 扩展包的首选命令,因其仅写入 composer.json、下载包至 vendor/、更新 composer.lock,不触发全局依赖重解析,避免误升版本引发线上问题。

composer require 是安装绝大多数 PHP 扩展包的正确命令,不是 composer install,也不是手动改 composer.json 后再 composer update——后者容易误升其他依赖,引发线上行为突变。
为什么 composer require 是首选?
它只做三件事:写入 composer.json、下载包到 vendor/、更新 composer.lock。不碰其他已锁版本,不触发全局依赖重解析。
而 composer update 会重新计算整个依赖树,哪怕你只加一个包,也可能把 monolog/monolog 从 2.9.1 升到 2.10.0,而这个小版本可能悄悄改了日志上下文格式。
- 新包必须运行在项目根目录下:执行
ls -la | grep composer.json(Linux/macOS)或dir composer.json(Windows)确认当前路径对 - 如果提示
Package not found,先检查包名是否完整,比如maatwebsite/excel少写maatwebsite/就找不到 - 加
-v参数可看真实失败原因:composer require laravel/sanctum -v,比静默失败更早暴露 PHP 版本或 Laravel 主版本不匹配
composer require 装不上?先查这三件事
不是包有问题,大概率是环境卡点没过。常见现象如:Could not parse version constraint、requirement not met、或命令执行完但 vendor/ 里没文件。
- PHP 和 Laravel 版本是否对得上?例如
maatwebsite/excel:^3.4要求 PHP ≥ 8.0 且 Laravel 10,Laravel 9 项目硬装会失败 - 国内网络直连
packagist.org基本超时,必须切镜像:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,换完立刻composer clear-cache - 某些包(如老版
barryvdh/laravel-debugbar)不支持自动发现,require成功后仍要手动加Barryvdh\Debugbar\ServiceProvider::class到config/app.php
装完为啥类找不到?autoload 没刷、provider 没配、facade 没挂
composer require 不等于“开箱即用”。很多包需要额外一步才能被代码识别,典型错误是 Class 'Excel' not found 或 Facade does not exist。
- 先跑
composer dump-autoload,尤其当你加了自定义命名空间或本地开发包时,否则vendor/autoload.php不知道新类在哪 - Laravel 8 及更早版本需手动注册服务提供者和门面;Laravel 9+ 默认启用 auto-discovery,但如果你在
composer.json里写了"dont-discover": ["*"],那所有包都得手配 - 配置文件没发布:比如 Excel 要运行
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"才生成config/excel.php,否则用默认值可能连 Excel 导出都报错
扩展包要不要加 --dev?看它进不进生产流程
加错位置,上线就炸。判断标准非常直接:你的业务代码里有没有 use 它、调用它的类或函数。
- 运行时依赖(如
guzzlehttp/guzzle、spatie/laravel-permission)必须无--dev安装,否则composer install --no-dev会删掉它,导致Class not found -
--dev只给纯开发工具:比如phpunit/phpunit、larastan/larastan、barryvdh/laravel-ide-helper - 有些包文档写“for Laravel”,但实际要求 Laravel 10+,而你项目是 9.x——
require成功不代表能用,得去它composer.json里查"require": {"laravel/framework": "^10.0"}
AMQPStreamConnection 是长连接、不能跨请求复用;或者 Excel 配置没发布,导出时默默用默认内存限制,大文件直接 500。这些细节不写在 composer require 的输出里,得你自己翻文档、看日志、试边界。










