composer install --no-dev是唯一可靠手段,它强制跳过require-dev包的解析、下载、安装及autoload注册,必须搭配--no-interaction、--optimize-autoloader和--prefer-dist用于生产部署。

composer install --no-dev 是唯一可靠手段
直接加 --no-dev 参数,就能跳过 require-dev 里所有包的解析、下载、安装和 autoload 注册。这不是权宜之计,而是 CI/CD 和 Docker 构建中必须启用的标准操作。
常见错误现象包括:部署后报 Class 'PHPUnit\Framework\TestCase' not found、vendor/bin 下出现 phpcs 或 pest、Docker 镜像体积莫名大出 20MB+——基本都指向漏了 --no-dev。
-
--optimize-autoloader只加速加载,不跳过 dev 包;它和--no-dev是互补关系,不是替代关系 -
config.platform对require-dev完全无效,设了"platform": {"php": "8.2"}也拦不住 phpunit 装进来 - 别在
post-install-cmd里用rm -rf vendor/phpunit/phpunit手动删——vendor/autoload.php里还留着映射,运行时直接Class not found
生产部署必须搭配的参数组合
仅 --no-dev 不够,线上环境还需防止构建卡住、加载慢、网络不稳定等问题。
-
--no-interaction:避免因权限确认或交互式提示导致自动化流程中断 -
--optimize-autoloader:生成静态 classmap,跳过文件系统扫描,提升类加载速度 -
--prefer-dist:优先下载压缩包而非 Git clone,减少网络开销和构建时间
这四个参数(--no-dev --no-interaction --optimize-autoloader --prefer-dist)建议一起用,顺序无关,但缺一不可。环境变量如 COMPOSER_NO_INTERACTION=1 不能代替 --no-dev,它只管交互,不管依赖范围。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
什么时候该用 composer update --no-dev
composer update --no-dev 仅适用于 CI/CD 中需要更新生产依赖的场景,比如每日自动同步安全补丁。日常开发不用它,更不能在生产机上跑。
-
composer install --no-dev:基于现有composer.lock安装,安全、可复现,是上线部署的标配 -
composer update --no-dev:会重算依赖树、修改composer.lock,仅限需要升级生产包版本时使用 - 千万别在生产环境执行
composer update(不带--no-dev),哪怕只是临时调试——laravel/pint或symfony/var-dumper很可能就混进去了
require-dev 包被生产包硬依赖怎么办
如果某个 require-dev 包被其他生产包显式 require(例如 A → B → dev-only-package),--no-dev 依然能从源头规避:Composer 解析依赖图时,发现该 dev 包不在 require 路径上,就不会把它纳入安装清单。
手动删包或靠 config.platform “假装”不满足条件,都不可靠。前者留下 autoload 映射,后者只影响 ext-xxx 类扩展检查,对包级依赖无约束力。
真正容易被忽略的是 autoload-dev 的残留影响:即使没装 dev 包,如果你在 autoload-dev 里注册了路径,又在主逻辑里写了 new Tests\FooTest(),照样崩。上线前务必用 composer install --no-dev --optimize-autoloader 模拟跑一遍。

















