--no-plugins 是安全关键开关,它强制 Composer 跳过所有插件加载(含全局和项目级),防止恶意插件在 install/update 时执行任意代码;必须紧接命令后使用,如 composer install --no-plugins。

Composer 禁用插件必须用 --no-plugins,不是 --no-plugin 或其他变体;漏掉这个参数,某些插件(比如 hijack 类的钩子)仍可能在 install/update 时执行任意代码。
为什么 --no-plugins 是安全关键开关
Composer 插件能 hook 到几乎所有核心命令(install、update、dump-autoload),甚至修改包下载行为或注入 autoload。当项目依赖不可信来源(如 fork 的私有包、CI 中拉取第三方 lock 文件),插件可能偷偷执行恶意逻辑。启用 --no-plugins 后,Composer 完全跳过插件加载流程——不读 composer.json 中的 plugins 配置,也不扫描 vendor 目录下的插件包。
- 它影响所有插件:包括全局安装的(
~/.composer/vendor/)和项目级的(vendor/) - 不会禁用 Composer 内置功能(如 autoloading、scripts),只停掉第三方扩展逻辑
- 与
--no-scripts独立,后者只跳过post-install-cmd等脚本,不防插件
--no-plugins 正确使用位置和常见错误
该参数必须紧跟在 Composer 命令之后、其他选项之前,否则会被忽略或报错。尤其注意不能放在 install 或 update 子命令之后。
- ✅ 正确:
composer install --no-plugins、composer update --no-plugins --with-dependencies - ❌ 错误:
composer install --with-dependencies --no-plugins(部分旧版 Composer 会忽略) - ❌ 错误:
composer --no-plugins install(参数位置错,等价于composer --help) - ⚠️ 注意:在 CI 脚本中,如果用了 alias 或 wrapper 脚本(如
bin/composer),需确认它没自动加插件相关 flag
替代方案:全局禁用插件(慎用)
若需长期禁用(例如在隔离构建环境),可设环境变量 COMPOSER_NO_PLUGINS=1。但它比命令行参数更隐蔽,容易被后续开发者忽略。
- 生效范围:当前 shell 会话及所有子进程,包括
php composer.phar调用 - 风险点:一旦设置,所有命令默认无插件,但
composer diagnose可能提示“plugins disabled”,反而掩盖真实意图 - 不推荐写入
~/.bashrc或 Dockerfile ENV —— 容易导致本地开发时意外失效(如依赖hirak/prestissimo加速却没报错)
真正安全的关键不是“记得加参数”,而是把 --no-plugins 显式写进 CI 的每一条 Composer 命令里,并在项目 README 的构建说明中标注。插件机制本身无害,但信任边界一旦模糊,--no-plugins 就是唯一能切断执行链的硬开关。










