--no-dev是生产环境体积优化的底线操作,必须与--optimize-autoloader联用:前者跳过dev包安装及autoload-dev注册,后者生成classmap绕过psr-4扫描;单独使用会导致autoloader仍扫描tests/目录,引发i/o开销和性能卡顿。

不加 --no-dev 就别谈生产环境体积优化——它不是“省点空间”,而是防止 vendor/ 膨胀、autoload 崩盘、线上 Class not found 的底线操作。
为什么 --no-dev 必须和 --optimize-autoloader 一起用
单独加 --no-dev 只跳过 require-dev 包的安装和 autoload-dev 注册,但不会重生成类映射表。结果就是:vendor/ 里没 phpunit,autoloader 却还在每次请求时反复扫描 tests/ 目录,白白多出 1ms+ I/O 开销。
-
--optimize-autoloader(或-o)强制把所有可发现类写进vendor/composer/autoload_classmap.php,绕过文件系统遍历 - 不加它,
class_exists('App\Http\Controllers\Home')每次要stat()十几个路径,QPS 高时明显卡顿 - 二者必须同时出现:
composer install --no-dev --optimize-autoloader才算真正生效
--no-dev 不生效的三个典型假象
命令写了,但实际没起作用,往往是因为环境或上下文干扰:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用了
composer dump-autoload -o替代composer install --no-dev:前者不跳过 dev 包安装,也不清理autoload-dev规则,classmap里照样塞满Tests\映射 - 先跑了没加
--no-dev的命令,再补composer install --no-dev:后者不会自动删掉之前装的 dev 包,得先rm -rf vendor再重装 - CI 中用了缓存
vendor/目录:缓存没区分--no-dev场景,导致旧的含 dev 包的vendor被复用
验证 --no-dev 是否真正生效的三处真实痕迹
别信日志,看物理事实:
- 执行后检查
vendor/目录下是否还存在phpunit/phpunit、symfony/debug-bundle等包路径 - 打开
vendor/composer/autoload_static.php,搜索Tests\或Factories\,确认没有相关命名空间映射 - 部署后立刻运行:
php -r "require 'vendor/autoload.php'; var_dump(class_exists('Tests\Helper'));",应返回bool(false)
光用 --no-dev 还不够,必须加这四个参数
--no-dev 只管“不装”,不管“不残留”。真正可控、安全、可复现的减体积方式,是四者互锁生效的最小安全集:
-
--no-dev:跳过require-dev中所有包,但不会清理已存在的 autoload 映射 -
--prefer-dist:强制走 zip 包而非 git clone,避免带入.git/和未裁剪的源码树(对私有包无效,除非你明确配置了dist字段) -
--optimize-autoloader:生成autoload_classmap.php,把类名直连路径 -
--classmap-authoritative:让 autoloader 彻底放弃 fallback 到 PSR-4 扫描——性能翻倍,但要求所有用到的类都必须进classmap
漏掉任意一个,要么体积不减,要么类加载失败。最常被忽略的是:--no-dev 不会自动删 vendor/bin/phpunit、vendor/*/tests/、vendor/composer/installed.json——这些残留不清理,轻则泄露源码结构,重则被利用执行命令。










