--no-scripts 仅跳过 composer.json 中 scripts 定义的钩子,不控制插件在 activate() 等处硬编码执行的逻辑,也跳过不了 autoload 阶段脚本;需配合 COMPOSER_DISABLE_PLUGINS=1 或环境变量等手段才能彻底禁用。

为什么 --no-scripts 有时没生效
它只跳过 composer.json 中 "scripts" 定义的钩子(如 post-install-cmd),但不跳过插件主动注册的脚本——比如某些私有包的 Composer 插件会在 Plugin::activate() 里直接执行逻辑,这种绕过了 --no-scripts 的控制。
常见错误现象:composer install --no-scripts 仍触发了数据库迁移或资源构建,说明脚本来自插件而非标准 scripts 配置。
- 确认脚本来源:检查
vendor/composer/installed.json里是否有插件条目,再查其源码是否在activate()或executeCommand()中硬编码执行 - 插件级脚本需单独禁用:有些插件支持环境变量(如
COMPOSER_DISABLE_PLUGINS=1),或提供自己的配置开关 -
--no-scripts对composer create-project也有效,但要注意该命令默认会运行post-create-project-cmd—— 这个会被跳过
composer install 和 composer update 下 --no-scripts 的行为差异
两者都支持该参数,但触发时机和影响范围不同。核心区别在于:install 读取 composer.lock 精确还原依赖,update 先计算新版本再写 lock,而部分脚本(尤其是 pre-update-cmd)可能在 update 前就已运行。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
composer install --no-scripts:跳过所有 install 相关 hooks(pre-install-cmd,post-install-cmd等),但不会跳过pre-autoload-dump这类 autoload 阶段的脚本(它们属于 dump 阶段,非 install 阶段) -
composer update --no-scripts:跳过pre-update-cmd和post-update-cmd,但不跳过pre-dependencies-solving(如果插件注册了) - 若想彻底避免任何脚本,组合使用:
COMPOSER_NO_INTERACTION=1 COMPOSER_DISABLE_PLUGINS=1 composer install --no-scripts
CI/CD 中安全使用 --no-scripts 的前提条件
很多 CI 流水线用它防止单元测试或部署脚本被意外触发,但这只有在项目未把关键初始化逻辑塞进 scripts 时才真正安全。一旦 post-install-cmd 负责生成配置文件或清理缓存,跳过它会导致后续命令失败。
- 先跑一次
composer install(不带--no-scripts),观察哪些脚本是必须的,再决定能否跳过 - 检查
composer.json的"scripts"是否包含副作用操作:比如调用php artisan config:clear、npm run build,这些跳过后需手动补位 - 某些框架(如 Laravel)的
post-autoload-dump会生成优化类映射,跳过会导致性能下降,但不会报错——这点容易被忽略
替代方案:按需禁用特定脚本而非全跳
比起一刀切的 --no-scripts,更细粒度的方式是临时屏蔽某个 hook,尤其当只想跳过一个耗时或易出错的脚本时。
- 用
--no-plugins配合--no-scripts:防止插件注入额外脚本 - 临时清空 scripts:运行前改写
composer.json(如jq 'del(.scripts."post-install-cmd")' composer.json > tmp.json && mv tmp.json composer.json) - 环境变量覆盖:部分自定义脚本会检查
$_ENV['SKIP_POST_INSTALL'],可在 CI 中设SKIP_POST_INSTALL=1实现条件跳过
--no-scripts 管,但又确实发生在安装流程里。

















