正确方法是用composer require --dev 包名或composer require 包名 --dev,将包写入require-dev字段;若误入require,需删vendor和composer.lock后重装。

dev依赖必须写进 require-dev,且安装时显式加 --dev;否则会污染生产依赖树,上线后可能因包缺失或 autoload 冲突直接报错。
怎么把包正确加进 require-dev
用 composer require 时,--dev 参数必须紧贴命令末尾,顺序不能错:
-
composer require phpunit/phpunit --dev✅(写入require-dev) -
composer require --dev phpunit/phpunit✅(等效) -
composer require phpunit/phpunit❌(误入require,上线也会装) -
composer require phpunit/phpunit -d❌(-d是旧版别名,Composer ≥ 2.2 后建议统一用--dev)
装完立刻检查 composer.json:确认包出现在 "require-dev" 字段下,而非 "require"。否则后续 composer install --no-dev 仍会把它拉进来。
为什么 --no-dev 有时不生效
常见原因不是参数没加,而是环境变量或 lock 文件干扰:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
COMPOSER_NO_DEV=1被设为全局生效(比如 CI 脚本里 export 过但没 unset),此时即使加了--no-dev也重复生效,而漏掉它反而照样跳过 —— 优先查echo $COMPOSER_NO_DEV -
composer.lock是别人用--no-dev生成并提交的,你本地执行composer install(无参数)也不会装 dev 包,因为 lock 文件已锁定不含 dev 的依赖树 - 验证是否真没装:运行
composer show --dev,输出No dependencies installed for development才算成功;再手动ls vendor/看phpunit、php-cs-fixer目录是否存在
dev 分支依赖怎么安全引入
直接写 dev-main 很容易失败,因为 Composer 默认只认 stable 版本:
- 先查真实分支名:
composer show vendor/package --all,别硬套main,GitHub 默认分支可能是develop或next - 安装时带 commit hash 更稳:
composer require vendor/package:dev-main#abc123,避免下次update拉到意外变更 - 如果不想改全局稳定性,用
--stability-dev:composer require vendor/package:dev-main --stability-dev,它会自动在composer.json加"stability-flags" - 注意:dev 分支没语义化版本约束,
composer update可能拉到不兼容的新 commit,lock 文件无法提供 tag 那样的确定性
autoload-dev 和 --no-dev 的关系容易被忽略
--no-dev 只控制「是否安装包」,不控制「autoload 规则是否注册」:
- 如果某个包在
require-dev里定义了"autoload-dev": {"psr-4": {"Tests\": "tests/"}},那它被跳过安装后,vendor/autoload.php就不会加载Tests\命名空间 - 但如果你代码里写了
new TestsFooTest(),运行时就会Class not found—— 因为类根本没被装,也没被映射 - 更隐蔽的是:有些包把
autoload-dev和autoload写混了,或者路径指向了 src 下的生产代码,这时--no-dev也无法阻止它们被加载
真正要留意的,是那些既在 require-dev 里、又通过 autoload-dev 暴露了生产可用类的包 —— 它们会让环境边界变得模糊,上线前务必人工 review。










