composer require phpunit/phpunit是错的,因不加--dev会将其写入require字段,导致ci用--no-dev部署时跳过安装,但代码若调用phpunit\framework\testcase则直接报class not found。

不加 --dev 就不是 dev 依赖,它会直接进 require,上线时照样被装、照样报 Class not found。
为什么 composer require phpunit/phpunit 是错的
这条命令没带 --dev,Composer 默认只改 require 字段。结果就是:phpunit/phpunit 被写进生产依赖区,CI 脚本跑 composer install --no-dev 时它被跳过,但本地 composer install 仍会装——看似正常,实则埋雷。
- 线上环境执行
composer install --no-dev后,vendor/phpunit目录不存在 - 如果某处代码(比如一个调试中间件)写了
new \PHPUnit\Framework\TestCase(),上线直接 fatal error -
composer.lock里该包出现在packages而非packages-dev区块,说明它根本不在 dev 体系内 - 修复必须两步:先
composer remove phpunit/phpunit(从require删除),再composer require --dev phpunit/phpunit:^10
composer require --dev 的正确写法和常见变形
--dev 是开关,不是修饰符,位置灵活但不能省略。旧版支持 -d,但 Composer ≥ 2.2 后建议统一用 --dev,避免静默失效。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer require phpunit/phpunit --dev✅ -
composer require --dev phpunit/phpunit✅(等效) -
composer require phpunit/phpunit -d⚠️(兼容但不推荐,某些版本会忽略) -
composer require phpunit/phpunit❌(进require,不是 dev) - 想只改
composer.json不安装?加--no-install:composer require --dev php-cs-fixer --no-install
装完怎么确认它真在 require-dev 里
别信命令输出,要看文件和实际状态。光写进 require-dev 不代表安全,得验证是否被隔离。
- 打开
composer.json,确认包名出现在"require-dev": { ... }对象内,且"require"里没有重复项 - 运行
composer show --dev,应列出该包;若无输出或报No dependencies installed for development,说明没生效 - 删掉
vendor/和composer.lock,执行composer install --no-dev,然后ls vendor/ | grep phpunit应为空 - 注意:如果
composer.lock是别人用--no-dev提交的,你本地composer install(无参数)也不会装 dev 包——lock 文件已锁定不含 dev 的依赖树
dev 分支依赖(如 dev-main)为什么总装不上
不是命令错了,是 Composer 的稳定性策略挡住了。默认只认 stable,写了 dev-main 也会 fallback 到最近 stable tag。
- 先查真实分支:
composer show vendor/package --all,别硬套main,GitHub 默认分支可能是develop或next - 装的时候带 commit hash 最稳:
composer require vendor/package:dev-main#abc123 - 或者用
--stability-dev自动配全局策略:composer require vendor/package:dev-main --stability-dev,它会在composer.json补"stability-flags" - 检查
composer.lock中对应包的version字段,要是9999999-dev或类似映射值,说明 fallback 成功了,但你没拿到真正的 dev 分支 - dev 分支没语义化版本,
composer update可能拉新 commit,lock 文件无法保证确定性——这点比 tag 依赖脆弱得多
真正容易被忽略的点是:--dev 只控制「写入位置」,而 --no-dev 才决定「是否安装」;但即使没安装,只要代码里有 class_exists() 或无条件 require,autoload 还是可能触发失败。边界永远在代码调用逻辑里,不在配置行数上。










