新闻中心
为何我的Composer库不应该在require中包含测试框架_Composer库开发中devDependencies的最佳实践
不应该将测试框架放入require中。运行依赖应与开发依赖分离,PHPUnit等工具必须置于require-dev,避免污染用户环境、引发冲突或增加冗余;主流PHP库均遵循此实践,通过autoload-dev配置测试命名空间,并在CI中正确安装dev依赖;发布时确保不提交vendor目录,使用非dev构建验证兼容性;同时在README中提供贡献指南,明确测试执行方式,如通过composer test运行,保障开发体验与生产纯净性。

开发一个Composer库时,是否在require中引入测试框架(如PHPUnit),是一个常见的设计决策问题。答案很明确:不应该。你的库的require部分应只包含运行时必需的依赖,而测试框架属于开发期工具,应放在require-dev中。
1. 区分运行依赖与开发依赖
require 中的包是你的库运行所必需的。任何使用你库的项目都会自动安装这些依赖。require-dev 则仅用于本地开发、测试、构建等场景,不会被下游项目加载。
测试框架如 PHPUnit 只在你写单元测试时需要,用户的项目运行你的库时完全不需要它。如果把它放在 require 中,会导致:
- 用户项目无端多出不必要的依赖
- 可能引发版本冲突或安全扫描误报
- 增大部署体积,降低安装效率
2. 遵循 Composer 社区最佳实践
所有主流 PHP 库(如 Symfony 组件、Lar*el 包)都将 PHPUnit 放在 require-dev 中。这是社区共识,也是 Packagist 和框架文档推荐的方式。
你的 composer.json 应该类似这样:
}
这样,开发者贡献代码时可以通过 composer install 安装测试工具,而使用者通过 composer require your/library 时不会拉取任何测试相关组件。
拾贝
一键同步微信读书所有笔记和划线,并在新标签页回顾
186
查看详情
3. 正确发布库,避免泄露 dev 依赖
当你发布库到 Packagist,Composer 默认只会读取 require 来确定依赖。但如果你在 CI 或构建流程中操作不当,可能间接影响用户体验。
确保:
- 不将
vendor/提交到版本控制 - CI 测试时运行
composer install --dev - 生产构建或静态分析环境使用非 dev 安装方式验证兼容性
4. 提供清晰的贡献指南
虽然测试框架不在主依赖中,但你仍需让其他开发者能顺利运行测试。在 README 中添加开发说明:
Contributing: Run tests with: composer test Ensure you h*e installed dev dependencies first.并在 scripts 中定义:
基本上就这些。把测试框架留在 require-dev,是对使用者负责,也是专业库开发的基本素养。简单却关键。
以上就是为何我的Composer库不应该在require中包含测试框架_Composer库开发中devDependencies的最佳实践的详细内容,更多请关注php中文网其它相关文章!
# 后端
# 潍坊优化网站价格
# 网站优化结构图片素材库
# 门店营销推广报价方案
# 营销策略品牌推广方案
# 道路建设规划公示网站
# 美国有seo吗
# seo关键词排名宝典易速达
# 校服营销推广文案怎么写
# 谷歌网站优化公司广元
# 影视网站怎么做推广挣钱
# 这是
# 是一个
# php
# 如何处理
# 如何使用
# 工作流
# 拾贝
# 并在
# 如何解决
# 放在
# 工具
# composer
# json
# js
# laravel
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
提升Kafka消费者健壮性:会话超时处理与消息处理语义
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
Go Martini框架:动态服务解码后的图片内容
ArrayList与LinkedList操作复杂度详解:遍历与修改
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
如何在Promise链中有效终止错误处理后的执行
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
在Typer应用中优雅地处理和重组任意命令行参数
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
高德地图公交到站提醒失败如何解决 高德提醒权限设置
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航
葱吃多了会怎样 葱吃多了会伤胃吗
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
Python getattr() 异常处理深度解析:避免程序意外退出
AO3最新入口2025公告_AO3中文官网合集
响应式图片在网页设计中的正确实现方法
深入理解Go语言中的指针类型:以*string为例
PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧
J*aScript教程:根据元素文本内容动态设置背景色
TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程
《噬血代码2》新预告片发布 展示游戏剧情
知音漫客正版漫画平台_知音漫客官网账号登录
Python类型检查:优化关联可选属性的Mypy推断策略
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
Fabric模组开发:自定义物品与物品组的现代管理方法
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
妖精动漫免费平台 妖精动漫官网资源观看网址
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
c++ dfs和bfs代码 c++深度广度优先搜索算法
漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
如何有效阻止外部脚本意外修改内联样式的高度属性
Eclipse怎么运行工程_Eclipse工程运行配置说明
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法
Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示
解决Python单元测试中Mock异常方法调用计数为零的问题
Python多版本共存与虚拟环境管理深度指南
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法


2025-12-05
浏览次数:次
返回列表