composer install/update/require 加 --no-scripts 可全局跳过所有 scripts(如 post-install-cmd),但保留依赖下载、autoload.php 生成等核心功能;不支持禁用单个脚本,需手动修改 composer.json;误加 --no-autoloader 会导致 Class not found。

composer install 时跳过所有脚本执行
直接加 --no-scripts 参数即可禁用所有 scripts 配置中定义的命令,包括 post-install-cmd、pre-autoload-dump 等。这个参数作用于整个安装流程,不区分脚本类型或触发时机。
- 它不会影响依赖下载、自动加载器生成(
vendor/autoload.php)等核心行为,只屏蔽脚本调用 - 适用于 CI/CD 构建阶段,避免因环境缺失(如未装 Node.js)导致
npm run build类脚本失败而中断安装 - 注意:如果项目依赖某个脚本生成的文件(例如前端资源打包产物),跳过后可能导致后续运行报错
composer update 跳过脚本但保留 autoload 重建
--no-scripts 在 update 命令中同样生效,但需注意:它会跳过 post-update-cmd,但不会阻止 Composer 自动重写 autoload.php —— 这是默认行为,与脚本无关。
- 若你只想禁用自定义脚本,又希望确保类自动加载配置更新,无需额外操作;
--no-scripts已足够 - 不要混淆
--no-autoloader:它会彻底跳过 autoload 文件生成,通常不该和--no-scripts同时用,除非你手动维护 autoload - 常见误操作:在 Docker 构建中同时加
--no-scripts --no-autoloader,结果运行时报Class not found
如何只禁用某一个脚本而非全部
Composer 原生不支持按名称禁用单个脚本,--no-scripts 是全局开关。若需精细控制,只能临时修改 composer.json 中的 scripts 段落。
- 比如想跳过
post-install-cmd但保留pre-autoload-dump,可先注释或删掉对应字段再执行 install - 自动化场景下可用 shell 临时 patch:
jq 'del(.scripts."post-install-cmd")' composer.json | jq '.' > composer.json.tmp && mv composer.json.tmp composer.json
- 某些第三方插件(如
hirak/prestissimo)曾提供更细粒度钩子,但现代 Composer(2.2+)已不再兼容,不建议依赖
no-scripts 对 require 命令的影响
composer require 默认触发 post-require-cmd 和 post-update-cmd,加 --no-scripts 后这些都会被跳过。
- 如果你通过
require安装一个需要运行初始化脚本的包(例如 Laravel 的php artisan vendor:publish),加了该参数就什么都不会发生 - 开发本地调试时,建议先不加
--no-scripts,确认脚本能正常运行后再考虑是否在部署环节禁用 - 没有 “仅对新增包执行脚本” 的内置机制;脚本是否执行,只取决于命令是否带
--no-scripts,与包是否新装无关
post-install-cmd 会生成 config/local.php,禁用后程序启动直接报错,而错误信息里完全不会提示“因为脚本没跑”。










