require与require-dev版本约束语法相同,但约束目标、更新频率和影响范围不同;require需保障生产稳定性,推荐使用^或~限定小版本范围,避免无上限写法。

require 和 require-dev 的版本约束写法本身没有语法区别,但**约束目标、更新频率和影响范围完全不同**。你不能靠“给同一个包写两套版本号”来实现环境切换——Composer 不支持条件化依赖声明。
require 中的版本约束必须满足生产稳定性
生产环境依赖的版本约束,核心是「可控」与「可重复」:
-
require里的约束要尽量避免无上限写法(如"monolog/monolog": ">=2.0"),否则composer update可能拉入破坏性更新 - 推荐用波浪符
~或插入符^:例如"^2.10"表示允许安装2.10.x系列,但不跨小版本;"~2.10.0"更精确,等价于>=2.10.0 - 关键服务组件(如数据库驱动、HTTP 客户端)建议锁定次版本范围,比如
"guzzlehttp/guzzle": "^7.4",避开8.x的 BC break - PHP 自身版本也应显式约束在
config.platform.php中,防止本地装了php:8.3却在php:8.1的生产机上因扩展缺失或语法报错
require-dev 的版本约束可以更宽松,但需注意加载隔离
require-dev 包只在开发/测试阶段存在,它的版本约束主要服务于「工具链可用性」,而非运行时兼容性:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 测试框架(如
phpunit/phpunit)可用"^9.6 || ^10.0",方便 CI 在不同 PHP 版本下适配 - 代码检查工具(如
phpstan/phpstan)建议用最新稳定版,比如"^1.10",因为它们不参与运行时,只影响本地分析质量 - ⚠️ 容易踩的坑:
require-dev中的包如果被autoload-dev声明了类,这些类**不会出现在生产环境的vendor/autoload.php中**。若代码里写了class_exists('PHPUnit\Framework\TestCase')并据此做逻辑分支,生产会返回false——这不是 bug,是预期行为
环境差异不能靠版本号区分,而靠 install 参数控制
所谓“开发 vs 生产版本不同”,其实是通过命令参数决定「哪些约束生效」,而不是让 Composer 解析两套规则:
- 开发机器执行
composer install→ 同时读取require和require-dev,安装全部依赖 - CI 测试流程执行
composer install --no-dev→ 忽略require-dev字段,且跳过autoload-dev的注册 - 生产部署必须用
composer install --no-dev --optimize-autoloader --classmap-authoritative,这三者缺一不可 - ⚠️ 关键细节:
--no-dev不仅跳过安装,还会让 Composer **完全忽略require-dev中所有包的 autoload 配置**。哪怕你手动 require 了某个 dev 包的文件,也会因类未注册而 fatal error
install 命令的参数组合决定。很多人调通了本地,却在生产报 Class not found,问题往往出在误用了 --no-dev 下仍试图调用 dev-only 类,而不是约束写错了。










