禁用 composer 自动脚本的唯一可靠方式是加 --no-scripts 参数,因为 scripts 字段仅声明钩子,执行与否由命令参数控制;删空或删除该字段无效,且易被 lock 文件或 composer update 恢复,而 composer_no_interaction=1 和 --no-dev 均不作用于脚本执行。

禁用 Composer 自动脚本的唯一可靠方式是加 --no-scripts 参数,不是删 scripts 字段、不是设环境变量、也不是靠 COMPOSER_NO_INTERACTION=1。
为什么删掉 composer.json 里的 "scripts" 字段没用?
Composer 的脚本执行逻辑和配置解析是解耦的:scripts 字段只是声明,是否执行由命令参数决定。删掉它,只是让 Composer 没东西可跑;但只要别人提交了带脚本的 composer.lock,或者你运行 composer update 后重新生成 lock,脚本就又回来了——而你根本没意识到。
更危险的是:空对象("scripts": {})或空数组("scripts": [])也会被 Composer 忽略,但它仍会尝试执行钩子,只是找不到对应命令而报错或静默失败。
- 真正生效的只有运行时开关:
--no-scripts或等价的COMPOSER_NO_SCRIPTS=1环境变量 -
COMPOSER_NO_INTERACTION=1只关闭交互提示(如 license 确认),完全不影响脚本执行 -
--no-dev只控制require-dev包安装,对脚本零影响
哪些命令支持 --no-scripts?
--no-scripts 是 Composer 2.2+ 原生支持的参数,适用于所有主流命令:
-
composer install --no-scripts:跳过post-install-cmd、pre-autoload-dump等 -
composer update --no-scripts:跳过post-update-cmd、pre-package-update -
composer require vendor/package --no-scripts:跳过post-require-cmd和post-update-cmd -
composer remove vendor/package --no-scripts:同样生效(Composer 2.2+)
注意:--no-scripts 不影响 vendor/autoload.php 生成——那是 Composer 核心流程,和脚本无关。若要跳过 autoload,得额外加 --no-autoloader,但通常不该这么做,否则运行时大概率报 Class not found。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
插件脚本和 --no-scripts 无关
某些包(如 phpstan/extension-installer、ocramius/package-versions)通过 Composer 插件注册钩子,这些钩子写在插件代码里,不在 composer.json 的 scripts 字段中。因此:
-
--no-scripts对它们完全无效 - 要禁用插件,得用
--no-plugins或配置extra.disabled-plugins - 插件还可能在
composer.lock中固化行为,光改composer.json不解决根本问题
典型现象:CI 中加了 --no-scripts,但构建仍因 PackageVersions::dump 失败而中断——这就是插件在作祟。
如何临时跳过某个特定脚本?
Composer 原生不支持按名称禁用单个脚本,--no-scripts 是全局开关。若真需要精细控制,只能靠脚本自身逻辑:
- 把 PHP 回调改成条件判断,例如
"post-install-cmd": "MyClass::doSomething",然后在方法里读取getenv('SKIP_POST_INSTALL')提前 return - Shell 命令可加判断,比如
"post-install-cmd": "[ -z \"$SKIP_POST_INSTALL\" ] && php artisan optimize" - 自动化流程中可用
jq临时 patchcomposer.json:先删掉目标脚本字段,执行完再恢复
别指望靠注释掉某行 JSON 来“禁用”——JSON 不支持注释,会导致 composer validate 失败或解析出错。










