<p>composer install 时跳过 scripts 的最直接方式是使用 --no-scripts 参数,它会跳过所有 pre- 和 post- 类型脚本(如 post-install-cmd),但不影响 autoload 生成;该参数对 update 同样有效,而 create-project 需配合 --no-install 和后续 --no-scripts 才能完全跳过初始化脚本。</p>

composer install 时跳过 scripts 执行
默认情况下,composer install 会触发 post-install-cmd、post-autoload-dump 等脚本,但 CI 构建、Docker 构建或本地快速验证依赖时,常需要绕过它们——尤其是当脚本里有 php artisan optimize 或 npm run build 这类非必要、耗时或环境不兼容的操作。
最直接有效的方式是加 --no-scripts 参数:
composer install --no-scripts
这个参数会跳过所有 scripts 段定义的钩子,包括 pre- 和 post- 类型。注意它不影响自动加载器生成(vendor/autoload.php 仍会正常生成),只停脚本。
-
--no-scripts对composer update同样生效 - 如果用了
composer install --no-dev --no-scripts,记得确认是否真不需要dev包——有些脚本依赖phpunit或phpstan,删了反而报错 - 某些私有包的
post-autoload-dump脚本可能负责生成代理类(如 Laravel 的EventServiceProvider注册逻辑),跳过会导致运行时报Class not found
composer create-project 跳过初始化脚本
composer create-project 默认会执行目标项目的 post-root-package-install 和 post-create-project-cmd,比如 Laravel 安装后自动运行 php artisan key:generate。如果你只是想拉下代码结构、不跑初始化,不能只靠 --no-scripts——它对 create-project 无效。
正确做法是显式禁用这两个钩子:
composer create-project laravel/laravel myapp --no-interaction --remove-vcs --no-install --no-scripts
再手动 cd myapp && composer install --no-scripts。关键点在于:--no-install 阻止首次安装时触发脚本,而后续 install 再加 --no-scripts 才真正落地。
-
--no-install不会生成vendor/,适合只想看项目骨架的场景 - 若项目
composer.json里写了"scripts": {"post-create-project-cmd": "rm -rf .git"},跳过它可能留下意外的 Git 信息 -
--no-interaction必须带上,否则create-project在无响应模式下会卡住
全局配置跳过 scripts(慎用)
想一劳永逸?可以用 composer config 把 --no-scripts 设为全局行为:
composer config -g scripts false
这会在 ~/.composer/config.json 里写入 "scripts": false。但它不是开关,而是告诉 Composer:「别读 composer.json 里的 scripts 段」——连 composer dump-autoload 触发的 post-autoload-dump 也全失效。
- 这个设置影响所有项目,包括你后期 clone 的别人的项目,容易导致功能异常(比如 Symfony 的
cache:warmup不自动跑) - 恢复方式是
composer config -g --unset scripts,不是设成true - CI 中推荐用临时环境变量:
COMPOSER_NO_INTERACTION=1 COMPOSER_NO_SCRIPTS=1 composer install,更安全
为什么有些脚本还是执行了?检查这些地方
即使加了 --no-scripts,仍看到命令输出,常见原因不是参数失效,而是脚本被其他方式触发:
-
composer dump-autoload单独运行时,仍会触发post-autoload-dump——它不属于install流程,需额外加--no-scripts - 某些包在
require时通过PluginInterface注册了自定义事件监听器(如phpstan/extension-installer),这类不走scripts配置,--no-scripts无效 -
composer.json里把命令写在scripts外部(比如自定义extra字段 + 插件解析),这种属于插件行为,得查对应插件文档关掉 - Dockerfile 里写的是
RUN composer install && php artisan migrate,后半句是 shell 命令,跟 Composer 脚本无关,自然不会被跳过
真正要跳过某条命令,得先确认它是 Composer 脚本触发的,还是人工写死在构建流程里的——后者得改 Dockerfile 或 CI 脚本本身。









