composer install --no-dev是唯一可靠手段,它跳过require-dev包的解析、下载、安装及autoload注册,确保仅部署生产依赖,需配合--optimize-autoloader、--no-interaction和--prefer-dist使用。

直接用 composer install --no-dev 就能跳过所有 require-dev 包,只装生产环境真正需要的扩展依赖。这不是权宜之计,而是 Composer 官方支持、CI/CD 和 Docker 构建中必须启用的标准操作。
为什么 --no-dev 是唯一可靠手段
Composer 不会自动区分环境——composer install 默认把 require 和 require-dev 全部装上。一旦漏掉 --no-dev,像 phpunit/phpunit、fakerphp/faker、symfony/var-dumper 这类开发专用包就会进生产 vendor/,带来体积膨胀、autoload 冲突和安全扫描告警。
-
--no-dev会让 Composer 彻底跳过require-dev字段:不解析、不下载、不写入vendor/autoload.php的 classmap,也不会出现在composer.lock的packages-dev区块里 - 它不修改
composer.lock,哪怕这个 lock 文件是在带 dev 包的环境下生成的,也能正确读取并只安装 production 部分 -
config.platform对 dev 包完全无效——有人误以为设了"platform": {"php": "8.2.10"}就能约束 dev 包版本,其实不能
常见错误:误用 platform 或 post-install-cmd “删包”
有人想靠 config.platform 模拟 Linux 环境来“过滤掉 Windows-only 包”,或在 post-install-cmd 里用 rm -rf vendor/some-linux-only-package 手动清理——这两种做法都危险且不可靠。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
config.platform只影响依赖解析阶段对ext-xxx的匹配,它无法控制是否安装require-dev中的包;更关键的是,它只对上游包显式声明了"require": {"ext-pcntl": "*"}才生效 -
post-install-cmd删除已安装包会导致vendor/autoload.php仍保留该包的 PSR-4 映射,运行时直接Class not found - 如果某个
require-dev包被其他生产包硬依赖(比如 A → B → dev-only-package),--no-dev能从源头规避,而手动删包只会让 autoload 失败更隐蔽
Docker 和 CI/CD 中必须加的参数组合
仅 --no-dev 还不够,生产部署需配合优化参数避免副作用:
-
--optimize-autoloader:生成静态 classmap,跳过文件系统扫描,提升加载速度 -
--no-interaction:防止因交互式提示(如权限确认)导致构建卡住 -
--prefer-dist:优先用压缩包而非 Git clone,减少网络开销和构建时间 - 不要用
--ignore-platform-reqs替代--no-dev——前者绕过 PHP 版本和扩展检查,后者才是精准剔除 dev 包的语义化开关
真正要限制的不是“操作系统”,而是“环境角色”。--no-dev 是唯一直接、无副作用、被所有主流部署流程验证过的做法。复杂点在于:很多人混淆了平台能力(PHP/扩展)和环境职责(dev/prod),结果用错机制,反而引入运行时风险。










