新闻中心

Composer 中的 require 和 require-dev 有什么本质区别?

2025-12-12
浏览次数:
返回列表
本质区别在于使用场景和安装时机:require是运行必需依赖,所有环境都安装;require-dev仅开发测试时需要,生产环境用--no-dev跳过。

composer 中的 require 和 require-dev 有什么本质区别?

本质区别在于使用场景和安装时机不同:require 是项目运行必需的依赖,必须存在于所有环境;require-dev 是仅在开发、测试阶段需要的工具类依赖,生产环境默认不装。

require:上线就靠它

这些包是应用启动和运行的基石。没有它们,代码根本跑不起来。

  • 框架本身(如 Lar*el、Symfony、Yii2)
  • 数据库操作层(如 doctrine/orm、illuminate/database)
  • 核心 SDK(如 aliyuncs/oss-sdk-php、wechat/php-sdk)
  • 日志、缓存、HTTP 客户端等运行时组件(如 monolog/monolog、guzzlehttp/guzzle)

执行 composer installcomposer update 时,它们一定会被安装,且会随项目一起部署到生产服务器。

require-dev:只在你写代码时帮忙

这些包不参与业务逻辑,只服务开发流程,比如写测试、查 bug、规范代码。

  • 测试框架:phpunit/phpunit、pestphp/pest
  • 代码质量工具:phpstan/phpstan、friendsofphp/php-cs-fixer
  • 调试辅助:yiisoft/yii2-debug、symfony/var-dumper
  • 生成器与模拟器:fakerphp/faker、mockery/mockery

它们只在你本地或 CI 环境中用 composer install(不加参数)时才装。上线前加 --no-dev 就彻底跳过,既省空间又少风险。

Procys Procys

AI驱动的发票数据处理

Procys 102 查看详情 Procys

autoload 和实际加载也跟着区分

composer 自动生成的 vendor/autoload.php 会注册 require 和 require-dev 的自动加载规则——但前提是那些包真的存在。

  • 如果你用 --no-dev 部署,require-dev 的包没装,对应类文件就不存在
  • 如果代码里不小心 new 了一个 PHPUnit 类,线上就会报 Class not found
  • 所以别在业务逻辑中引用 dev 工具类,哪怕 autoloader 看似支持

谁来决定装不装?看是不是“根项目”

require-dev 只对当前项目的 composer.json(即“根包”)生效。

  • 你在自己的项目里加了 phpunit 到 require-dev,运行 composer install 就会装进 vendor/
  • 但如果别人把你这个项目当依赖引入他的项目,他的 composer install 不会装你的 require-dev
  • 也就是说,require-dev 不会“传染”,只服务于本项目开发

基本上就这些。不复杂但容易忽略细节。

以上就是Composer 中的 require 和 require-dev 有什么本质区别?的详细内容,更多请关注php中文网其它相关文章!


# 里加  # 贵阳营销网站seo优化  # 汉口网站seo优化怎么做效果好  # 和平区全网营销推广  # 株洲抖音关键词搜索排名推广  # 农产品营销推广诚信企业  # 网站推广获客服务商是什么  # 市场营销专业化推广方向  # 网站平台推广运营方案  # 怎么写完善seo  # 杭州网站建设优化标题  # 器中  # 故障排除  # 装进  # 自己的  # 跳过  # composer  # 会报  # 只在  # 如何在  # 有什么  # 模拟器  # 区别  # iis  # 工具  # yii  # json  # js  # laravel  # php  # require 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Surface怎么安装系统 微软Surface Pro U盘重装win11教程  Lar*el Form Request中唯一性验证在更新操作中的正确实现  PHP中高效并行检查多链接状态的教程  mc.js免安装版 mc.js一键畅玩入口  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  优化Django表单:提交验证失败后保留用户输入  QQ官网正版登录链接 QQ在线登录入口最新  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  SteamMachine定价或为699美元 大家想入手吗?  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  Discord Slash 命令响应超时问题的异步解决方案  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  Angular中父组件异步更新子组件复选框状态的实践指南  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  excel怎么制作工资条 excel快速生成工资条的方法  高德地图公交到站提醒失败如何解决 高德提醒权限设置  必由学网页版入口 必由学官方平台直接访问  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  MongoDB聚合管道:正确匹配对象数组中_id的方法  解决Python单元测试中Mock异常方法调用计数为零的问题  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  抖音网页版怎么|直播|_抖音网页版开播操作指南  微信商城在哪里打开【步骤】  J*aScript数组对象转换:按指定键分组与值收集  必由学在线入口 必由学网页版快速登录入口  FullCalendar 自定义按钮样式定制指南  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  J*aScript 字符串标签转换:使用正则表达式高效替换  必由学官方网站入口 必由学学生教师共用登录通道  excel如何生成目录 excel一键生成工作表目录超链接  J*aScript中正确使用querySelectorAll与复杂CSS选择器  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  2026春节假期时间安排 2026春节假日查询  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  《噬血代码2》新预告片发布 展示游戏剧情  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  解决深度学习模型训练初期异常高损失与完美验证准确率问题  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法 

搜索