composer install 默认联网是因为需检查 packagist.org 更新及校验包 hash;强制离线需用 --no-repository --ignore-platform-reqs。

composer install 为什么默认联网?
因为 composer install 默认会检查 packagist.org(或你配置的仓库)是否包版本有更新、校验 hash 是否一致,哪怕 composer.lock 已存在。它不是“纯离线还原”,而是带验证的在线行为。
怎么强制只读本地文件不联网?
加两个关键参数:禁用仓库 + 跳过平台检查。实际生效的是这组组合:
-
--no-repository:跳过所有远程仓库查询(包括 packagist 和自定义 repo) -
--ignore-platform-reqs:避免因 PHP 或扩展版本不匹配触发远程 fallback(有些插件会悄悄查兼容性)
完整命令:composer install --no-repository --ignore-platform-reqs
注意:--no-plugins 不是必须的,除非你明确知道某个插件会主动联网(比如某些私有仓库插件),否则不加更安全。
常见错误现象和坑
你以为断网就能强制离线?不一定。这些情况仍可能报错或悄悄联网:
-
Composer\InstalledVersions类被 require 但未生成 → 实际是vendor/autoload.php没加载成功,不是联网问题,而是composer install前没清干净vendor/或composer.lock损坏 - 用了
path类型 repository → 它本身是本地路径,但若配置里写了"url": "https://...",--no-repository会直接报错:“Repository not found”,得删掉或注释掉该 repo 配置 -
composer.lock里含 dev 分支(如"dev-main")→--no-repository会拒绝安装,提示 “Could not find package … in a version matching …”,必须先用composer update --lock锁成具体 commit hash 再离线
本地文件依赖的可靠性边界
只靠 composer install --no-repository 并不能 100% 保证“完全不动网络”。真正稳的离线流程是:
- 在有网环境跑一次
composer install,确保vendor/和composer.lock齐全 - 把整个项目目录(含
vendor/)打包带走,而不是只带源码 - 目标机器上,用
composer install --no-repository --ignore-platform-reqs启动,它只会校验vendor/里已有的文件 hash 是否匹配composer.lock
如果你只带源码不带 vendor/,那 --no-repository 就只是“不查仓库”,但依然要解压 zip 包——而 zip 包地址如果写在 composer.json 的 dist.url 里,且是 HTTPS 链接,它还是会尝试下载。










