COMPOSER_DISABLE_PLUGINS=1 是唯一可靠方式,因它在初始化阶段就跳过插件发现与注册逻辑,连 autoload 都不加载插件类;而 --no-plugins 仅跳过部分钩子,某些插件仍可通过事件监听器或自定义 installer 生效。

为什么 composer install 会触发插件?
Composer 默认会在安装/更新时自动加载并执行已声明的第三方插件(比如 hirak/prestissimo、dealerdirect/phpcodesniffer-composer-installer 等),这些插件可能修改下载行为、注入脚本、检查代码规范,甚至拦截依赖解析流程。所谓“沙箱模式”,并不是 Composer 官方术语,而是指**完全绕过所有插件执行,只做最基础的依赖解包和文件复制**。
COMPOSER_DISABLE_PLUGINS=1 是唯一可靠方式
Composer 提供了环境变量开关,这是禁用插件最直接、最彻底的方法——它在初始化阶段就跳过插件发现与注册逻辑,连 autoload 都不会加载插件类。不推荐用 --no-plugins 参数,因为该参数仅跳过部分钩子(如 pre-install-cmd),但某些插件仍可能通过事件监听器或自定义 installer 生效。
- Linux/macOS:运行前加环境变量,例如
COMPOSER_DISABLE_PLUGINS=1 composer install - Windows(CMD):用
set COMPOSER_DISABLE_PLUGINS=1 && composer install - Windows(PowerShell):用
$env:COMPOSER_DISABLE_PLUGINS="1"; composer install - CI/CD 中建议写成多行命令或提前 export,避免遗漏
插件禁用后哪些行为会变化?
禁用插件不是“安全模式”,而是功能裁剪。以下行为将失效或回退到默认逻辑:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer require不再触发插件注册的自定义 installer(例如 PHP-CS-Fixer 的自动配置写入) - 并行下载(
hirak/prestissimo)退回到单线程 cURL 下载 - 自动执行的 post-install-cmd / pre-autoload-dump 脚本(由插件注册)全部跳过
- 某些插件提供的命令(如
composer normalize)将报错Command "normalize" is not defined. - 注意:
scripts段中定义的原生脚本(非插件提供)不受影响
验证插件是否真被禁用
最简单的验证方式是观察输出日志是否有插件加载痕迹,或主动触发一个已知插件命令:
- 运行
COMPOSER_DISABLE_PLUGINS=1 composer list | grep -i "prestissimo\|phpcs",结果为空说明插件未注册 - 如果项目含
dealerdirect/phpcodesniffer-composer-installer,禁用后vendor/bin/phpcs仍存在,但composer phpcs:install这类插件命令会报错 - 更底层验证:临时删掉
vendor/composer/autoload_plugins.php,再执行composer install—— 若无报错且流程继续,则说明插件路径未被读取,COMPOSER_DISABLE_PLUGINS=1已生效
真正要小心的是:有些插件会把逻辑硬编码进 composer.json 的 scripts 或 extra 字段,这种不属于“插件”范畴,环境变量无法屏蔽,得手动清理配置。

















