composer install 默认安装 require-dev 中的测试包,生产环境应使用 composer install --no-dev 跳过;ci 中需配合 --no-cache 并验证 vendor 目录无 phpunit 等包。

为什么 composer install 会装一堆测试用的包?
默认情况下,Composer 会安装 require-dev 区块里所有依赖,包括 phpunit、mockery、phpstan 这类仅在本地开发或 CI 中需要的工具。它们体积大、安装慢,还可能引入冲突(比如 symfony/console 的高版本和你主项目不兼容)。
生产环境部署时跳过 dev 依赖的正确命令
在服务器或 CI 的部署流程中,必须显式禁用 dev 依赖,否则等于把本地开发环境搬上生产机:
- 用
composer install --no-dev—— 这是唯一可靠方式;--optimize-autoloader可以加,但不是跳过 dev 的关键 - 不要依赖
COMPOSER_NO_DEV=1环境变量,它在某些 Composer 版本(如 2.2+)中已被弃用或行为不稳定 - CI 脚本里如果先跑了
composer install再跑--no-dev,前者已写入vendor/,后者不会清理已装的 dev 包——必须从干净状态重来
composer.json 里哪些 dev 依赖其实可以移出?
不是所有标在 require-dev 里的都“必须是 dev”。有些工具实际影响运行时行为,比如:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
doctrine/doctrine-bundle如果只用于 Symfony 的 CLI 命令(如doctrine:database:create),可保留在require-dev -
symfony/debug-bundle或symfony/web-profiler-bundle必须严格限制在 dev,它们会暴露敏感信息 -
vlucas/phpdotenv在 5.x+ 版本中已支持生产使用,若项目用它加载环境变量,应移到require,否则上线后.env读取失败
CI 中如何验证 --no-dev 真生效了?
光跑命令不够,得确认结果。最直接的方法是检查 vendor 目录是否真的没装那些大包:
- 执行
composer install --no-dev && ls -la vendor/ | grep -E '^(phpunit|phpstan|psalm|mockery)',输出应为空 - CI 日志里搜
Installing phpunit/phpunit,如果有这一行,说明命令写错了或缓存污染了 - 某些私有镜像或
packagist.org镜像会缓存含 dev 的composer.lock,建议 CI 中固定用composer install --no-dev --no-cache避免误用旧 lock 文件
dev 依赖的边界容易模糊,尤其当某个包既提供 CLI 工具又提供运行时类时——得看你的代码里有没有 use 它的类,而不是只看它叫什么名字。










