唯一官方支持的禁用方式是每次运行命令时显式添加--no-scripts参数,它适用于install、update、require和remove等命令,可跳过scripts字段定义的所有钩子,但不影响autoload生成;清空scripts字段或设置环境变量均无效。

没有全局配置项能永久禁用 Composer 脚本执行。唯一可靠、官方支持的方式是每次运行命令时显式加上 --no-scripts 参数。
为什么不能靠修改 composer.json 或环境变量禁用脚本
很多人误以为清空 "scripts" 字段、注释掉某条钩子,或者设置 COMPOSER_NO_SCRIPTS=1 就能跳过脚本——这些全部无效。
-
"scripts"字段只是声明,是否执行由命令参数决定,不是“没写就不跑” - Composer 不识别
COMPOSER_NO_SCRIPTS这类环境变量,文档和源码中均无该配置 -
--no-dev只影响require-dev包安装,对脚本零影响 - 删掉
post-install-cmd是禁用单个脚本,但无法“批量关闭”,且容易漏掉pre-autoload-dump等隐式事件
哪些命令支持 --no-scripts
--no-scripts 是 Composer 原生命令行开关,适用于以下核心命令:
-
composer install:跳过post-install-cmd、post-autoload-dump等 -
composer update:跳过post-update-cmd、pre-update-cmd -
composer require和composer remove(Composer 2.2+)
注意:composer run-script 不受 --no-scripts 影响——它本来就是专门用来执行脚本的。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
CI/CD 中必须加 --no-scripts 的真实原因
不是为了提速,而是避免非预期失败:
- 脚本尝试连接数据库、写入缓存目录或调用未安装的 CLI 工具(如
php-cs-fixer),在 CI 容器里直接报错退出 - 某些脚本依赖交互输入(比如密钥生成),而
--no-interaction并不能阻止脚本自身卡住 - 错误信息常表现为:
Script handling the post-install-cmd event returned with error code 1,根源却不在依赖本身 - 搭配
--no-autoloader可进一步减少副作用,但会丢失自动加载能力,慎用
--no-scripts 和 --no-plugins 的区别别搞混
这两个参数作用对象完全不同,经常被一起用,但不能互相替代:
-
--no-scripts:只跳过composer.json里"scripts"字段定义的钩子(如post-install-cmd) -
--no-plugins:阻止所有插件(plugin)的事件监听器被触发,不影响"scripts"本身 - 一个包可能既带插件又带脚本,两者都得禁用才彻底隔离:
composer install --no-scripts --no-plugins - 插件相关逻辑(如自定义 installer)仍存在于
vendor/,只是本次不激活
真正容易被忽略的是:即使你禁用了所有脚本,vendor/autoload.php 依然会生成——这是 Composer 自身流程,和脚本无关。如果连 autoload 都不想动,必须额外加 --no-autoloader,但多数生产部署场景不需要这么做。

















