require-dev 应仅放测试框架、代码检查器等纯开发工具,如 phpunit/phpunit;若应用代码直接调用则须放 require;命令行安装需加 --dev 参数,部署时必须用 --no-dev,本地路径包可用 path 仓库热更新。

require-dev 里装什么才合理
开发依赖只该放那些「永远不进生产环境」的工具:测试框架、代码检查器、生成器、调试辅助类库。比如 phpunit/phpunit、php-cs-fixer、roave/security-advisories(用于检测已知漏洞)——这些包在运行时完全不需要,但缺了就写不了测试、跑不了 CI、格式一塌糊涂。
常见错误是把 symfony/console 或 monolog/monolog 错误塞进 require-dev,结果线上命令行工具或日志功能直接失效。判断标准很简单:这个包是否会被你的应用代码 直接调用?如果是,它就得在 require 里。
-
require-dev中的包默认不会出现在自动加载映射中,除非你额外配置了autoload-dev - 它的版本约束语法和
require完全一致,支持^、~、dev-main等写法 - 如果某个包同时出现在
require和require-dev,Composer 会取两者中更严格的版本约束来解析
composer require --dev 命令怎么用才不翻车
加开发依赖最安全的方式就是用命令行显式声明,而不是手动改 composer.json。执行:
composer require --dev phpunit/phpunit:^10.5
这条命令会做三件事:下载包及其子依赖、写入 require-dev 字段、更新 composer.lock。漏掉 --dev 参数,包就会进 require,后续上线部署时想剔除就得手动删配置,容易遗漏。
- CI 脚本里必须写
composer install --no-dev,否则会白装一堆无用包,还可能因扩展缺失(如 dom 扩展没启用)导致失败 - 本地开发时别滥用
composer update全量刷新;要只更新某一个 dev 包,用composer update phpunit/phpunit --with-dependencies,否则它的子依赖(比如sebastian/exporter)可能卡在旧版,引发 Class not found - 误删
vendor/autoload.php后,composer dump-autoload不会恢复文件本身,必须先composer install或composer update
本地路径包怎么进 require-dev
当你正在迭代一个私有组件(比如内部封装的 SDK),又不想每次改完都 push tag + 发布到私有源,就可以用 path 类型仓库把它挂进 require-dev。配置方式如下:
在项目根目录 composer.json 的 repositories 字段里加一段:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"repositories": [
{
"type": "path",
"url": "../my-sdk"
}
]
然后执行:
composer require --dev my-vendor/my-sdk:dev-main
注意:../my-sdk 目录下必须有合法的 composer.json,且其中 name 字段必须和 require 里的完全一致;目录还得是 Git 仓库(至少有一个 commit),否则 Composer 拒绝加载。
- 安装后,
vendor/my-vendor/my-sdk是个符号链接,指向你本地目录 —— 这是热更新的关键,改完 SDK 代码不用重装 - 如果本地 SDK 默认分支不是
main,比如叫develop,那require得写成"dev-develop",不能硬套dev-main - 不要在
require-dev里混用path和远程包,尤其当它们有相同依赖时,容易触发版本解析冲突
上线前检查 require-dev 是否真的被跳过
很多人以为只要写了 --no-dev 就万事大吉,但实际部署脚本里常有隐藏陷阱:比如某些 Dockerfile 用了 composer install 却没带参数;或者 CI 流水线里 composer install 前没清空 vendor,导致旧的 dev 包残留。
验证方法很简单:部署完成后,进容器或服务器,执行:
ls vendor/ | grep -E 'phpunit|php-cs-fixer|mockery'
如果返回非空,说明 --no-dev 没生效。更彻底的方式是检查 composer show --dev 输出是否为空。
另一个容易被忽略的点是:某些包虽然进了 require-dev,但它的自动加载规则(autoload-dev)可能被主项目 autoload 配置意外覆盖,导致本地开发时类能加载,CI 里却报错 —— 这类问题往往只在特定 PHP 版本或扩展组合下暴露。

















