Composer 没有“只下载不安装”的内置命令,其设计是下载、解压、安装原子化完成;所谓“卡在下载”实为解压、autoload 生成或脚本执行阶段。

Composer 没有“只下载不安装”的内置命令。 它的设计模型是“下载 + 解压 + 安装(写入 vendor + 生成 autoload)”原子化完成,不存在分离下载与安装的官方开关。
为什么 composer install 看似“卡在下载”其实是解压和写入阶段
你可能遇到 composer install 在某个包上长时间停住,误以为它在“下载”,实际多数情况是:
- 正在解压一个大 zip 包(尤其是含大量小文件的包,如
symfony/symfony),磁盘 I/O 高、stat() 调用多 - 正在生成 autoload 文件,特别是未加
--optimize-autoloader时,要扫描整个vendor/目录 - 触发了
post-install-cmd脚本(如php artisan optimize或npm install),而该脚本本身耗时
composer install --no-scripts --no-plugins 是最接近“纯安装”的组合
如果你目标是跳过所有副作用,仅完成依赖解包和自动加载器生成(即“最小化安装”),必须显式禁用两类钩子:
-
--no-scripts:防止post-install-cmd或pre-install-cmd执行任意命令(比如清缓存、生成配置、跑 npm) -
--no-plugins:阻止插件介入安装流程(如hirak/prestissimo已废弃,但某些私有插件仍可能重写下载逻辑)
示例命令:
composer install --no-dev --no-scripts --no-plugins --optimize-autoloader --no-interaction
注意:--no-dev 不影响“是否下载”,只控制是否解包 require-dev 里的包;真正减少下载量的是镜像源或 --prefer-dist(默认启用)。
想提前预热或离线部署?得换思路:用 composer install --dry-run + composer download 替代方案
Composer 本身不提供 download 子命令,但可通过以下方式模拟“先下载后安装”:
- 在联网环境执行:
composer install --no-dev --no-scripts --no-plugins --ignore-platform-reqs,让所有包解压进vendor/,再打包整个vendor/目录供离线使用 - 用
composer install --dry-run查看将安装哪些包及版本,再手动用curl或wget去https://api.github.com/repos/{vendor}/{package}/tarball/{version}或 packagist 的 dist URL 下载 tarball(不推荐:URL 结构不稳定、需处理 auth、无校验) - 更可靠的做法是构建阶段用 Docker 多阶段构建:第一阶段完整
composer install,第二阶段只复制vendor/和代码,彻底规避线上下载
真正容易被忽略的是:所谓“下载慢”,90% 源于没配国内镜像源。执行 composer config -g repo.packagist https://packagist.phpcomposer.com(或华为/腾讯镜像)后,install 整体耗时通常下降 5–10 倍——别在命令参数上绕弯子,先检查源配置。


















