composer require 默认不安全,因其将包写入 require 字段,导致开发工具如 phpunit 被误装入生产环境;正确命令是 composer require --dev 或简写 composer require -d。

必须用 composer require --dev 或 composer require -D,否则包会进 require,上线时照样被装上——这不是开发依赖,是生产隐患。
为什么 composer require 默认不安全?
默认不带 --dev 的 composer require phpunit/phpunit 会把包写入 require 字段,导致:
- CI 构建或
composer install(无参数)时,phpunit被拉进vendor/,哪怕你只在本地写测试 - 生产部署若漏掉
--no-dev,vendor/里多出几十 MB 无关代码,autoload 映射膨胀,还可能触发__destruct或 class 冲突 - 某些包(如
symfony/var-dumper)在配置中被引用,但没进require-dev,一上生产就Class not found
composer require --dev 和 composer require -D 有啥区别?
-D 是兼容性更强的写法,尤其对旧版 Composer(--dev 在新版中可靠,但位置敏感:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer require -D phpunit/phpunit✅ 全版本通用 -
composer require --dev phpunit/phpunit⚠️ Composer ≥2.2 才保证生效 -
composer require phpunit/phpunit --dev❌ 参数位置错,--dev被忽略,仍进require
误加进 require 怎么补救?
别只手动删 composer.json 里的条目——composer.lock 还记着它,下次 install 会悄悄还原。必须清干净:
- 删掉整个
vendor/目录 - 删掉
composer.lock - 改好
composer.json,确保目标包只在require-dev下 - 运行
composer require -D phpunit/phpunit(或你实际要的包)
生产环境部署时,光写对 require-dev 还不够
写对只是第一步。部署脚本里必须显式加 --no-dev:
-
composer install --no-dev --optimize-autoloader—— 这才是线上镜像的标准命令 - Dockerfile 中禁止出现裸
composer install,否则 CI 和生产行为不一致 - 如果用了
autoload-dev,确认它的路径(比如"tests/")没意外包含src/或app/下的文件,否则类可能被生产代码 autoload 触发
最容易被忽略的是:本地跑通 ≠ 线上安全。只要 composer install 命令没带 --no-dev,或者 composer.json 里混进了不该在 require 的 dev 工具,上线那一刻就在埋雷。










