composer没有“开发者模式”这一内置概念,所谓开关实为误解;它不识别composer_dev_mode环境变量,唯一有效方式是使用--no-dev参数控制dev依赖安装,并依据composer.lock还原依赖。

Composer 没有“开发者模式”这个内置概念,所谓“开启/关闭开发者模式”是常见误解。 它不读 COMPOSER_DEV_MODE 环境变量,也不提供全局开关。真正起作用的,只有命令行参数和 composer.lock 的内容。
为什么COMPOSER_DEV_MODE=0根本没用
这个变量在 Composer 官方源码里不存在,也不是文档支持的配置项。你看到它,大概率是项目里某个自定义 wrapper 脚本(比如 bin/composer)自己加的逻辑判断。
- 运行
composer --version和which composer,确认你调用的是原生二进制,不是封装脚本 -
composer diagnose会报出非标准环境干扰,比如 alias、wrapper 或 PATH 冲突 - 依赖管理靠的是参数:加
--no-dev才跳过 dev 包;不加,就照composer.lock里记录的全装
composer install --no-dev到底做了什么
它只控制“是否安装 require-dev 里的包”,但不会清理已注册的 autoload-dev 路径,也不会删掉 vendor 里残留的测试文件。
- 如果
composer.lock里还存着phpunit/phpunit的记录,--no-dev会跳过安装,但vendor/phpunit/phpunit目录若已存在,就不会被自动删除 -
autoload-dev配置仍保留在vendor/autoload.php中,除非你额外跑composer dump-autoload --no-dev - 类名拼接逻辑(如
new $className)若引用了 dev 包里的类,且该类没被 classmap 收录,上线后可能直接Class not found
生产环境必须清理的 vendor 冗余项
光靠 --no-dev 远不够。很多危险路径即使不参与运行,也会暴露结构、泄露哈希、或被路径遍历漏洞利用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
vendor/bin/:全部删掉,除非你明确需要phinx或doctrine-migrations在线上执行 -
vendor/**/tests/、vendor/**/Tests/、vendor/**/test/、vendor/**/Test/ vendor/**/{.git,.gitignore,phpunit.xml,psalm.xml,phpstan.neon}-
vendor/**/docs/、vendor/**/examples/、vendor/**/demo/ -
vendor/composer/installed.json:含所有包版本与 SHA256 哈希,攻击者可据此精准匹配已知漏洞
Linux/macOS 下可用:find vendor -path '*/tests' -o -path '*/.git' -o -name 'phpunit.xml' -delete;CI 中建议显式 rm -rf,避免 glob 漏删。
--classmap-authoritative 是把双刃剑
它强制 autoloader 只查 autoload_classmap.php,彻底跳过 PSR-4 文件扫描,性能提升明显——但也意味着:任何没被自动发现的类(比如运行时拼接、class_exists($name, false) 后手动 require)都会直接失败。
- 必须搭配
--optimize-autoloader使用,否则 classmap 不生成 - 检查项目中是否存在
new $className、class_exists($name, false)、include_once动态路径等逻辑 - 某些包(如旧版 Laravel Mix 插件)会在 post-autoload-dump 阶段动态写入 classmap,漏掉这步会导致线上 500
最容易被忽略的一点:--classmap-authoritative 不影响 files 类型 autoload,但如果你用了 files 加载辅助函数,得确保它们全被 composer dump-autoload --optimize 收录进 classmap,否则上线就炸。










