composer如何安装开发环境专用的测试辅助包_composer require-dev用法【指南】
发布时间 - 2026-01-21 00:00:00 点击率:次composer require-dev 将包安装到 require-dev 而非 require,生产环境执行 composer install --no-dev 时不会安装,适用于 PHPUnit 等仅开发阶段需要的工具。
composer require-dev 会把包装进 dev-dependencies 而非 dependencies
这是最核心的区别:用 composer require-dev 安装的包,只会出现在 composer.json 的 "require-dev" 字段里,不会进入 "require"。这意味着这些包在生产环境(composer install --no-dev)下根本不会被安装,也不会被打包进最终部署产物。
典型适用场景包括:phpunit/phpunit、mockery/mockery、phpstan/phpstan、friendsofphp/php-cs-fixer 等——它们只在本地写测试、跑 CI、做静态分析时需要,上线后毫无作用。
如果你误用 composer require 装了测试包,它会混进 "require",导致生产环境多装一堆无用依赖,还可能引发冲突或安全扫描告警。
安装时加 --dev 参数和不加的区别
composer require-dev 是命令别名,等价于 composer require --dev。两者行为完全一致,只是写法偏好不同。但注意:没有 composer require-dev --no-dev 这种组合,后者会报错。
-
composer require-dev phpunit/phpunit→ 写入"require-dev",默认安装最新稳定版 -
composer require-dev phpunit/phpunit:^9.6→ 指定版本约束,推荐显式写明,避免 CI 环境因版本漂移失败 -
composer require-dev→ 强制连同其所有依赖(含可能本该是 dev 的间接依赖)一起进
--with-all-dependencies phpunit/phpunit
require-dev,慎用;多数情况不需要
require-dev 包在生产环境会被自动跳过
只要部署时执行的是 composer install --no-dev(Laravel Forge、Envoyer、大多数 CI/CD 流水线默认行为),require-dev 下的所有包及其依赖都不会被下载、解压、autoload。这能显著缩短部署时间、减小容器镜像体积、降低攻击面。
验证方式很简单:
composer install --no-dev ls vendor/ | grep phpunit # 应该什么也不输出
如果发现 vendor/phpunit 还在,说明要么没加 --no-dev,要么有人手动改过 composer.json 把它挪到了 require 里。
require-dev 和 autoload-dev 的配合容易被忽略
仅把包放进 require-dev 不够——如果这个包提供了测试专用的辅助类(比如自定义 PHPUnit TestCase、测试用的 Service Provider),你还得确保它们能被自动加载。这时要检查 composer.json 的 "autoload-dev" 段:
{
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
}
}
否则即使包装好了,new Tests\TestCase() 也会报 Class not found。常见疏漏点:
- 忘记运行
composer dump-autoload(尤其是改完autoload-dev后) - 路径写错,比如写成
"Tests\\": "test/"(少了个s) - 用了
classmap但没包含新测试目录,也没重新生成映射
开发阶段建议始终保留 autoload-dev 配置,并定期 composer dump-autoload -o 优化自动加载性能。
# php
# laravel
# js
# json
# composer
# 工具
# 解压
# 区别
# 开发环境
# require
# 堆
# class
# 而非
# 会报
# 装进
# 的是
# 这是
# 如果你
# 也不
# 自动加载
# 好了
# 还在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作企业网站建设方案,怎样建设一个公司网站?
网站制作价目表怎么做,珍爱网婚介费用多少?
如何在IIS7中新建站点?详细步骤解析
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
JavaScript如何实现音频处理_Web Audio API如何工作?
Python文件异常处理策略_健壮性说明【指导】
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel如何使用Eloquent进行子查询
焦点电影公司作品,电影焦点结局是什么?
晋江文学城电脑版官网 晋江文学城网页版直接进入
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
C#如何调用原生C++ COM对象详解
昵图网官网入口 昵图网素材平台官方入口
如何在自有机房高效搭建专业网站?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
独立制作一个网站多少钱,建立网站需要花多少钱?
MySQL查询结果复制到新表的方法(更新、插入)
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何挑选最适合建站的高性能VPS主机?
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Android利用动画实现背景逐渐变暗
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
南京网站制作费用,南京远驱官方网站?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
重庆市网站制作公司,重庆招聘网站哪个好?
Bootstrap整体框架之JavaScript插件架构
javascript中对象的定义、使用以及对象和原型链操作小结
Laravel如何记录自定义日志?(Log频道配置)
如何用PHP快速搭建CMS系统?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
在Oracle关闭情况下如何修改spfile的参数
bootstrap日历插件datetimepicker使用方法
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
微信公众帐号开发教程之图文消息全攻略


