禁用 composer install 的脚本执行应使用 --no-scripts 参数,它自 1.0 起支持且 v2.x 行为一致;--no-dev 和 --no-plugins 无法禁用脚本;配合 --no-autoloader 可跳过 autoload 生成;ci 中需结合环境变量如 composer_dev_mode=0 确保生效。

禁用 Composer install 的 post-install-cmd 等脚本执行
直接加 --no-scripts 参数即可跳过所有脚本(包括 post-install-cmd、pre-update-cmd 等)。这是最常用也最可靠的方案,Composer 从 1.0 起就支持,且在 v2.x 中行为一致。
常见误操作是只加 --no-dev 或 --no-plugins,它们完全不影响脚本执行——--no-plugins 只禁用插件本身,不阻止插件注册的脚本;--no-dev 只跳过 require-dev 下的包安装,脚本仍照常运行。
-
composer install --no-scripts:禁用全部脚本,包括根项目和已安装包中定义的scripts - 若同时想跳过 autoload 生成(比如你手动维护
vendor/autoload.php),可追加--no-autoloader - 注意:
--no-scripts不影响composer.lock校验或依赖解析逻辑,仅作用于执行阶段
为什么有时 --no-scripts 像没生效?
典型原因是命令被封装在 CI 脚本或 Makefile 里,实际执行的不是你写的那条命令。比如某些项目用 make install,背后调的是 composer install --no-interaction,漏掉了 --no-scripts。
另一个隐蔽问题是部分脚本由插件触发(如 hirak/prestissimo 旧版会注入下载钩子),这类不属于 scripts 配置项,--no-scripts 无法覆盖。此时需配合 --no-plugins,但要注意它会一并禁用自动加载优化、压缩等有用功能。
- 验证是否真生效:加
-v(verbose)参数,观察输出中是否还有Executing script行 - 若仍有脚本日志,检查
composer.json的scripts字段、vendor/composer/installed.json中各包的脚本声明,以及全局插件列表(composer global show) -
--no-scripts对composer create-project同样有效,但对composer update需单独加(它不继承 install 的参数)
CI/CD 中禁用脚本的典型组合
在 GitHub Actions、GitLab CI 等环境里,常见需求是跳过开发专用脚本(如前端构建、PHPStan 分析),只装依赖。这时不能只靠 --no-scripts,还要控制环境变量防止脚本内部条件判断绕过。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
COMPOSER_NO_INTERACTION=1 composer install --no-scripts --no-dev --optimize-autoloader- 设置
COMPOSER_DEV_MODE=0可让部分脚本主动退出(非标准行为,取决于脚本作者是否检查该变量) - 避免使用
composer install --dry-run来“模拟禁用”——它根本不下载包,也不生成 autoloader,和禁用脚本无关 - 如果项目用了
symfony/flex,它的 recipe 脚本属于插件行为,--no-scripts无效,必须用--no-plugins或移除 flex
禁用特定脚本而非全部?没有原生支持
Composer 没有类似 --disable-script=post-install-cmd 的选项。硬要只禁某个脚本,只能临时改 composer.json,删掉对应字段再恢复——CI 中可行,但本地开发容易误提交。
更稳妥的做法是在脚本定义里加环境判断,例如:
"scripts": {
"post-install-cmd": [
"@php -r \"if (getenv('SKIP_POST_INSTALL') !== '1') { /* real logic */ }\""
]
}
然后运行 Skip_POST_INSTALL=1 composer install。但这要求你有修改 composer.json 的权限,且所有目标脚本都得提前适配。
真正复杂的地方在于脚本嵌套:一个 post-install-cmd 可能调用另一个 composer run-script xxx,而后者又触发新脚本——--no-scripts 是全局开关,这种调用链里不会逐层检查,只要顶层禁用,整个链就断了。










