composer怎么在离线时避免重复解析依赖?

2次阅读

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

composer怎么在离线时避免重复解析依赖?

离线时 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 fileCould not find package xxx

  • 确保 composer.lock 是最后一次在线 installupdate 后 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/cachewindows%APPDATA%ComposerCache
  • cache 里包含 dist 包 tarball 和 metadata JSON,缺任意一项都可能导致 --offline 失败
  • 别依赖 composer dump-autoload 替代 install —— 它不处理依赖树和版本锁定

离线场景下,--offline 不是银弹,它只拒绝网络,不修复不一致;真正起作用的是 lock 文件、vendor 目录、cache 三者严丝合缝。少一个,就卡在某个 Could not parse version constraint 里出不来。

text=ZqhQzanResources