使用 –no-scripts 可跳过所有脚本执行:composer install –no-scripts 跳过 post-install-cmd 等,但仍生成 autoload 和 lock 文件;composer update –no-scripts 跳过 pre/post-update-cmd;ci/docker 中必备,避免脚本因环境缺失失败。

composer install 时想跳过所有脚本执行,用 --no-scripts
当你执行 composer install 或 composer update,Composer 默认会依次运行 post-install-cmd、post-update-cmd 等脚本——比如自动 dump-autoload、清缓存、生成配置文件。但有些环境(如 CI 构建、Docker 构建阶段、只拉依赖不跑逻辑的部署)根本不需要这些操作,甚至它们会失败(比如脚本里调了不存在的命令或依赖未就绪的扩展)。
直接加 --no-scripts 就能彻底跳过所有 scripts 段定义的命令,包括自定义脚本和 Composer 内置钩子。
-
composer install --no-scripts:跳过post-install-cmd等,但依然写vendor/autoload.php和生成composer.lock -
composer update --no-scripts:跳过pre-update-cmd、post-update-cmd,不会自动重 dump autoload - 它不影响依赖下载、安装、autoloader 生成本身,只拦脚本执行
只想跳过某几个脚本,而不是全部?没原生支持
Composer 没提供类似 --skip-script=post-update-cmd 这种细粒度开关。所谓“跳过某些包的脚本”,本质是误读——Composer 的脚本是项目级(composer.json 根节点 scripts)或插件级的,不是按包隔离的。某个包自带的脚本(比如通过 composer/installers 注入的),实际仍由项目根配置触发。
如果你发现某个第三方包的脚本总在出问题(比如 laravel/framework 的 post-autoload-dump 在无 ext-zip 环境报错),可行路径只有两个:
- 手动删掉该包
composer.json中的scripts字段(不推荐,下次更新会被覆盖) - 在项目根
composer.json中,把 problematic 脚本替换成空数组:"post-autoload-dump": [](注意不是NULL,否则会被忽略) - 更稳妥的是用
composer install --no-scripts+ 手动补必要操作(比如之后单独跑composer dump-autoload --optimize)
--no-scripts 在 Dockerfile 和 CI 中最常用
CI/CD 流水线或 Docker 构建阶段,目标只是获得可运行的 vendor/,而非模拟完整开发流程。此时脚本不仅多余,还可能因缺少环境变量、未安装 CLI 工具(如 php-cs-fixer)、权限不足而中断构建。
典型误用是写成:
RUN composer install --no-dev --optimize-autoloader
这仍然会执行脚本。正确写法必须显式带上 --no-scripts:
RUN composer install --no-dev --optimize-autoloader --no-scripts
另外注意:--no-scripts 不影响 autoload 配置解析,也不会跳过插件自身的安装逻辑(如 ocramius/package-versions 的生成步骤),那些属于 Composer 插件机制,不是 scripts。
为什么 composer create-project 也常带 --no-scripts
新建项目时,create-project 本质是先 git clone 或下载 zip,再 composer install。如果模板项目(如 laravel/laravel)的 composer.json 里写了 post-root-package-install 来生成 .env,那在自动化场景下就会失败(比如没交互输 APP_KEY)。
所以批量创建、模板化部署时,习惯加这一句:
composer create-project laravel/laravel myapp --no-scripts
之后再自己处理初始化逻辑,比让脚本半途崩溃更可控。
真正容易被忽略的是:即使你没在 composer.json 里写任何 scripts,某些包(尤其是框架和工具库)的 require-dev 依赖可能间接引入带脚本的插件,而 --no-scripts 是唯一全局拦截手段。