离线安装 composer 依赖需同时满足三条件:禁用所有网络触发点、确保 vendor 完整且 lock 未变、消除交互阻塞;推荐命令为 composer install --no-plugins --no-scripts --no-autoloader。

composer install 时跳过网络请求的几种方式
Composer 默认每次 install 都会访问 packagist.org 或配置的镜像源,即使 vendor 和 composer.lock 都存在。想完全离线安装,核心是让 Composer 不发起任何 HTTP 请求——不是“不更新”,而是“根本不去连”。
用 --no-plugins --no-scripts --no-autoloader + vendor 已存在
这是最常用、也最可靠的离线方案,前提是本地已有完整 vendor 目录且 composer.lock 未变。它不依赖缓存或镜像配置,纯靠文件系统。
-
--no-plugins:跳过插件初始化(很多插件会尝试联网校验) -
--no-scripts:防止 post-install-cmd 等脚本触发网络操作(比如调用 API 或下载额外资源) -
--no-autoloader:避免 autoloader 生成阶段意外触发远程类加载(极少见,但某些自定义 autoloader 逻辑可能隐含请求) - 必须确保
vendor/目录完整、所有包路径与composer.lock中记录的版本严格一致
执行命令:composer install --no-plugins --no-scripts --no-autoloader
设置 COMPOSER_CACHE_DIR + require --no-interaction
如果你需要在无网环境首次安装(比如 CI 构建机),得提前把依赖缓存“搬过去”。Composer 缓存本身不包含完整包,但配合 composer install --prefer-dist 和预下载的 dist 包,可实现离线拉取。
- 先在有网机器运行:
composer install --prefer-dist --no-scripts,再打包整个COMPOSER_CACHE_DIR(默认~/.composer/cache) - 把缓存目录复制到目标机器,并通过环境变量指定:
COMPOSER_CACHE_DIR=/path/to/cachedir composer install --no-interaction --prefer-dist -
--no-interaction关键:避免因缺少网络而卡在“是否启用 https://packagist.org?”这类交互提示 - 注意:dist 包缓存只对
zip/tar形式有效;如果项目里用了"type": "package"或 git 仓库依赖,仍可能失败
禁用 packagist 的三种写法及其区别
很多人以为加 "packagist.org": false 就万事大吉,其实不同位置效果完全不同,容易白配。
- 在
composer.json的repositories里写:{"packagist.org": false}→ 仅禁用该配置生效时的当前项目,但composer install仍可能读全局配置或 fallback 到默认源 - 在
composer.json里加:"repositories": [{"type": "packagist", "url": false}]→ 更明确,但部分旧版 Composer 会忽略url: false - 真正可靠的是命令行强制:
composer install --repository-url=none→ 直接绕过所有仓库配置,只认本地vendor和lock文件,但要求所有依赖必须已存在且版本匹配
错误示范:"repositories": [] 并不能禁用 packagist,默认行为仍会启用它。
最关键的细节是:离线安装不是“关掉网络就行”,而是要同时满足「无网络请求触发点」+「所有依赖已就位」+「无交互阻塞」。哪怕一个 post-install 脚本里写了 file_get_contents('https://...'),或者某个包的 autoload 里动态 require 远程 URL,都会让所谓“离线”当场失效。










