--no-scripts是跳过require时所有插件及包脚本执行的唯一有效参数,它全局屏蔽pre-require、post-require、post-package-install等钩子;--no-plugins仅禁用插件注册,不抑制脚本事件分发。

require 时跳过插件脚本执行的命令参数
Composer 默认会在 require 后触发已安装插件(如 composer/installers、ocramius/package-versions 或自定义插件)的 post-package-install 等事件脚本。如果你只是想快速添加依赖、避免脚本卡住或报错,最直接的方式是加 --no-scripts 参数:
composer require vendor/package --no-scripts
这个参数会跳过所有脚本钩子:包括 pre-require、post-require、post-package-install、post-autoload-dump 等——不只是插件脚本,也包括包自身定义的 scripts。
为什么不用 --no-plugins?
--no-plugins 确实能禁用插件加载,但它在 require 阶段效果有限:Composer 仍会读取 composer.json 中已声明的插件,并可能在后续 autoload 或 dump 阶段触发失败。更关键的是,它不阻止包自身定义的 scripts 执行。
-
--no-plugins主要影响插件类的自动注册,但不抑制脚本事件分发 -
--no-scripts是唯一能全局屏蔽所有脚本钩子的开关 - 两者可同时使用:
composer require vendor/package --no-plugins --no-scripts,但通常只需后者
哪些场景下必须跳过脚本?
常见于 CI/CD 流水线、Docker 构建或本地调试阶段,例如:
- 插件依赖未安装(如
phpstan/extension-installer在require前就被触发) - 脚本中调用了不存在的二进制(比如
php-cs-fixer未在 PATH 中) - 某些包的
post-install-cmd会尝试写入生产环境不可写的路径 - 你只想更新
composer.json和锁文件,不立即安装或执行任何逻辑
跳过脚本后要注意什么?
脚本被跳过 ≠ 依赖无效,但部分功能可能缺失:
- 某些包靠
post-install脚本生成配置文件或符号链接(如 Laravel 的php artisan vendor:publish自动触发),跳过后需手动补全 -
autoload不受影响,类仍可正常加载;但composer dump-autoload不会自动运行,如有新 PSR-4 映射需手动执行 - 如果项目依赖插件完成安装逻辑(如
drupal/core依赖drupal-composer/drupal-scaffold),跳过可能导致文件结构不完整
真正需要跳过的,往往是临时调试或构建隔离环境;长期绕过脚本,说明插件或包设计本身存在耦合过重的问题。











