Laravel项目中冗余包主要指require-dev里的开发依赖(如laravel/tinker、facade/ignition)及未使用的生产包(如laravel/sanctum),需通过--no-dev --optimize-autoloader部署、移除无引用服务提供者、检查隐性依赖并全面验证功能。
哪些包在 Laravel 项目里大概率是冗余的
新装的 Laravel 默认带了不少开发期才用得上的扩展包,比如
、
、
,这些在生产环境完全不需要加载,却会拖慢
和自动加载性能。尤其当部署到容器或低配服务器时,自动加载器生成的
文件体积变大,会直接影响请求响应速度。
判断依据很简单:看
里的包是否被线上代码实际调用过。例如
只用于包开发,
仅测试用——上线前必须移除。
运行
列出所有开发依赖
检查
的
和
,确认没有引用对应包的服务提供者或门面
搜索项目代码(含
、
、
)中是否出现该包的类名或 Fa
cad
e,比如
或
如何安全地移除 dev-only 包并避免 autoload 膨胀
直接删
项还不够。Composer 默认会为所有包(包括 dev)生成类映射,除非你明确告诉它“只 autoload production 依赖”。关键参数是
和
(简写
)。
部署脚本里务必用这组组合:
注意:
会让 Composer 把 PSR-4/PSR-0 映射预生成进
,跳过运行时文件扫描;而
不仅跳过安装,还会让 autoloader 完全忽略
中定义的命名空间。
本地开发仍可保留
,不影响日常调试
CI/CD 流水线或部署命令中漏掉
,会导致
这类包被加载,触发未预期的异常(比如试图注册已禁用的 Service Provider)
若用了
方式加载某些自定义类,记得在
的
里只保留生产必需路径
Laravel 自带但可按需关闭的“重型”扩展包
有些包虽在
里,但功能高度垂直,比如
(API 认证)、
(全文搜索)、
(队列监控)。如果你没在代码里调用它们,不光是浪费磁盘空间,还可能因自动发现机制悄悄注册中间件或监听器。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
典型表现:
HTTP 请求耗时莫名增加 10–20ms,查出是
在每次请求中检查 token
失败,报错
,说明配置里残留了 Scout 相关配置但包已卸载
队列 worker 启动变慢,因为
的
注册了大量事件监听器
操作建议:
先注释掉
中对应服务提供者的类名(如
)
运行
防止缓存干扰
确认无报错后,再执行
最后全局搜索项目,删掉所有
、
、
等调用
精简后要注意的隐性依赖和兼容陷阱
有些包看似独立,实则被 Laravel 核心间接依赖。比如
是
的子依赖(用于 HTTP Client),不能随便
;但
若没用
存储驱动,就可以安全移除。
更隐蔽的是“软依赖”:某些包没写在
里,但通过
或
动态检测是否存在,比如部分日志驱动或缓存适配器。强行删除可能导致
或静默降级。
用
查谁依赖它,例如
检查
下各 Provider 的
方法,看是否条件加载了某扩展
上线前务必跑一次
,验证基础容器能正常启动
真正难的不是删包,而是确认删完之后,所有请求路径、队列任务、Artisan 命令、甚至 Horizon 的 Web UI(如果还在用)都还能走通。这点很容易被忽略。
laravel/tinkerfacade/ignitionphpunit/phpunitcomposer installvendor/autoload.phprequire-devorchestra/testbenchmockery/mockerycomposer show --devconfig/app.phpprovidersaliasesroutes/app/tests/TinkerServiceProviderIgnitionServiceProviderrequire-dev--no-dev--optimize-autoloader-ocomposer install --no-dev --optimize-autoloader--optimize-autoloadervendor/composer/autoload_classmap.php--no-devrequire-devrequire-dev--no-devfacade/ignitionclassmapcomposer.json"autoload": {"classmap": [...]}requirelaravel/sanctumlaravel/scoutlaravel/horizonSanctumServiceProviderphp artisan config:cacheClass "Laravel\Scout\Searchable" not foundhorizonHorizonServiceProviderconfig/app.phpLaravel\Sanctum\SanctumServiceProvider::classphp artisan config:clearcomposer remove laravel/sanctumuse Laravel\Sanctum\*Sanctum::->withAccessToken()guzzlehttp/guzzlelaravel/frameworkremoveaws/aws-sdk-phpS3composer.jsonclass_exists()interface_exists()Call to undefined functioncomposer depends composer depends guzzlehttp/guzzlevendor/laravel/framework/src/Illuminate/Foundation/Providers/register()php artisan tinker --execute="echo 'ok';"