composer install --no-scripts 仅跳过 post- 前缀脚本(如 post-install-cmd),不阻止 pre-install-cmd、pre-autoload-dump 等前置钩子;若需彻底禁用,须配合 --no-plugins 和 --no-interaction。

为什么 composer install --no-scripts 有时仍会执行某些脚本
这个命令本意是跳过 scripts 段定义的所有钩子(如 post-install-cmd),但实际中你可能发现 pre-install-cmd 或 pre-autoload-dump 还是触发了——因为 --no-scripts 只跳过「安装完成后」的脚本,不阻止「安装前」或「自动加载生成前」这类前置钩子。
常见错误现象:composer install --no-scripts 后仍看到 Laravel 的 php artisan config:clear 或 Symfony 的 cache:clear 执行日志。
-
pre-install-cmd、pre-autoload-dump不受--no-scripts影响 - 真正被跳过的只有
post-install-cmd、post-update-cmd等带post-前缀的钩子 - 若想彻底禁用所有脚本,需配合
--no-plugins(部分插件会注册额外钩子)
如何确认哪些脚本会被执行
Composer 不会主动告诉你当前命令下哪些脚本生效,得靠人工检查 composer.json 和运行时输出。关键看两点:命令类型 + 钩子前缀。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer install -v(verbose 模式),观察输出中类似Executing script ...的行,它明确告诉你哪个钩子在何时触发 - 检查
composer.json的scripts字段,重点关注是否定义了pre-install-cmd、pre-autoload-dump等非post-开头的条目 -
composer dump-autoload --no-scripts也会跳过post-autoload-dump,但不影响pre-autoload-dump
替代方案:临时屏蔽特定脚本而非全局跳过
有时你只想跳过某一个烦人的脚本(比如 CI 环境里不需要清缓存),而不是一刀切关掉所有钩子。这时比 --no-scripts 更精准的做法是用环境变量或配置覆盖。
- 很多主流框架脚本支持
COMPOSER_NO_INTERACTION=1或APP_ENV=ci来内部跳过耗时操作 - Laravel 的
post-install-cmd脚本通常会检查$_ENV['APP_ENV'] !== 'local'再决定是否执行config:clear - 可临时设置
COMPOSER_SCRIPTS=0(部分自定义脚本识别该变量) - 更稳妥的方式:直接编辑
composer.json中对应脚本为"@echo Skipping...",CI 构建前用 sed 替换
CI/CD 中最稳妥的跳过策略
在 GitHub Actions、GitLab CI 等环境里,光靠 --no-scripts 容易漏掉前置钩子,导致构建失败或延迟。必须组合使用多个开关。
- 首选命令:
composer install --no-scripts --no-plugins --no-interaction -
--no-plugins是关键:某些插件(如hirak/prestissimo旧版、roave/security-advisories)会在安装阶段注入自己的钩子逻辑 - 若项目依赖
composer-bin-plugin或symfony/flex,它们的configure钩子可能在pre-install-cmd里,此时必须加--no-plugins - 注意:禁用插件后,某些包的自动配置(如 Flex 的 recipe)将不会应用,需手动补全
composer.json 里,而是由插件动态注册的——这种情况下,只看配置文件会误判。调试时别只盯 JSON,要抓 verbose 日志。










