断网时应使用 composer install --no-network 命令,前提是已有完整 vendor/ 和兼容的 composer.lock;该参数强制跳过所有远程请求,依赖本地缓存和 tarball 分发包。

断网时 composer install 报错 “Could not resolve host” 怎么办
根本原因不是命令本身有问题,而是 Composer 默认每次运行都会连 packagist.org 检查包元数据、更新锁文件或验证版本约束。断网时 DNS 解析失败,直接卡在 composer install 第一步。
关键前提是:你已有完整的 vendor/ 和有效的 composer.lock(即之前联网成功执行过 composer install 或 composer update)。
- 加
--no-interaction和--no-plugins不能解决网络问题,只是跳过交互和插件加载 - 真正起作用的是
--no-scripts和--no-progress—— 它们不解决联网,但能减少失败路径;核心还是得让 Composer 别去联网 - 必须确保
composer.lock是最新且与composer.json兼容的,否则即使断网也会报Your lock file does not contain a compatible set of packages
用 --no-network 强制跳过所有远程请求
这是 Composer 2.2+ 内置的开关,专为离线场景设计。它会禁用所有 HTTP 请求:不查 packagist、不验签名、不拉 dist source、不触发 repo 插件钩子。
注意:--no-network 不是“降级模式”,而是一个硬性拦截——只要代码里有 RepositoryManager::fetchPackage() 这类调用,就会被短路返回本地缓存或抛出明确异常(如 Package not found in local cache)。
- 只对
install和update生效,require或remove仍会尝试联网(因需解析新依赖) - 若项目用了私有 repo(比如
type: composer的内网源),该源的包必须已存在于~/.composer/cache/或项目vendor/中,否则照样失败 - 执行前确认
composer.lock里每个包的dist.url字段指向的是 tarball 路径(非 git 链接),否则--no-network无法 fallback 到本地归档
正确用法:
composer install --no-network
为什么 composer install 断网后有时仍能跑,有时立刻报错
行为差异取决于 composer.lock 的生成方式和当前 Composer 版本。Composer 1.x 默认走 packagist.org API,哪怕只校验 hash;Composer 2.2+ 在检测到 composer.lock 完整时,会优先读取本地 vendor/composer/installed.json 做快速比对。
- 如果上次
install是用--prefer-dist(默认),且所有包都以 tarball 形式下载并解压,断网后成功率高 - 如果含
"source": {...}类型的包(比如dev-main分支),Composer 会试图 clone git,断网必挂,除非提前用git archive手动塞进缓存 - 某些插件(如
hirak/prestissimo)已废弃,但若残留配置,可能在初始化阶段触发 DNS 查询,导致--no-network失效
本地缓存没清干净,--no-network 也救不了的情况
Composer 缓存分两层:全局 ~/.composer/cache/(含 zip/tar 包)和项目级 vendor/(含 autoload、installed.json)。断网时,前者缺失会导致 dist 包无法还原,后者损坏则连 autoloader 都构建失败。
- 检查缓存是否完整:
composer show --all | head -5
如果报Failed to initialize global composer: file could not be loaded,说明全局配置或缓存目录权限异常 - 手动补缓存:把另一台机器上
~/.composer/cache/files/下对应包的 zip 文件,按vendor/name/hash.zip路径复制过来 - 最稳的离线方案其实是提前运行:
composer install --no-dev --prefer-dist --no-scripts && composer archive --format=zip --file=offline-bundle.zip
然后在目标机解压覆盖vendor/,绕过 Composer 所有逻辑
离线不是单纯加个 flag 就行的事,本质是控制「哪些信息必须来自网络」「哪些可以固化」。很多人卡在 --no-network 不生效,其实是因为 composer.lock 里混了 git source,或者缓存目录被误删了一半。










