composer install 离线时仍联网是因为默认校验远程包存在性及解析不稳定版本;必须同时使用 --offline --no-plugins --no-scripts 才能彻底离线,且需确保 composer.lock、vendor 和本地 cache 三者严格匹配。

离线时 composer install 为什么还会联网?
因为默认行为下,composer install 会检查 composer.lock 里记录的包版本是否仍存在于远程仓库(比如 Packagist),即使本地已有 vendor 目录。它不信任本地缓存,尤其当 lock 文件里含 dev 分支、带 dev- 前缀或 ^/~ 等不稳定约束时,会尝试联网解析最新提交哈希或 tag 列表。
必须加 --no-plugins --no-scripts --offline 三连
仅靠 --offline 不够:某些插件(如 hirak/prestissimo)或脚本钩子仍可能触发网络请求;--no-plugins 阻止插件加载,--no-scripts 跳过 post-install-cmd 等执行逻辑,--offline 才真正让 Composer 拒绝任何 HTTP 请求。
-
--offline是核心开关,但单独用可能被插件绕过 -
--no-plugins关键,老项目常依赖下载加速类插件,它们默认无视--offline -
--no-scripts防止自定义脚本里调用file_get_contents('https://...')类操作
vendor/ 和 composer.lock 必须严格匹配
离线安装本质是“按 lock 文件精确还原”,一旦 vendor/ 里有手动增删的包、或 lock 文件被改写(比如你用 composer update 在另一台机器上更新过),composer install --offline 就会报错:Package xxx not found in lock file 或 Could not find package xxx。
- 确保
composer.lock是最后一次在线install或update后 commit 的原始文件 - 不要在离线环境运行
composer require或修改composer.json后直接install - 如果 vendor 缺包,得把完整 vendor 目录一起拷过去,不能只传 lock 文件
提前预热本地 cache 更可靠
在线时跑一次 composer install --prefer-dist --no-dev,再把 ~/.composer/cache 打包带走,离线机上解压到对应路径。否则哪怕有 lock 文件和 vendor,Composer 在校验包完整性时仍可能因缺 hash 缓存而失败。
- cache 路径在 Linux/macOS 是
~/.composer/cache,Windows 是%APPDATA%\Composer\Cache - cache 里包含 dist 包 tarball 和 metadata JSON,缺任意一项都可能导致
--offline失败 - 别依赖
composer dump-autoload替代 install —— 它不处理依赖树和版本锁定
--offline 不是银弹,它只拒绝网络,不修复不一致;真正起作用的是 lock 文件、vendor 目录、cache 三者严丝合缝。少一个,就卡在某个 Could not parse version constraint 里出不来。










