composer show --tree 在离线环境必然失败,因其强制联网请求 Packagist 元数据接口,不读取 composer.lock 或 vendor/,也不支持离线模式;离线依赖树只能提前在联网机导出或通过已安装的 vendor/ 和 installed.json 手动分析。

离线环境无法“配置”出依赖树——composer show --tree 本身必须联网解析元数据,断网时直接报错;真正能离线用的,只有已安装好的 vendor/ 目录或完整缓存包,再配合本地命令查结构。
为什么 composer show --tree 在离线机上一定失败
这个命令不是读 composer.lock 或 vendor/,而是实时访问 Packagist 元数据接口(如 https://repo.packagist.org/p2/monolog/monolog.json)来构建树。即使你配了 cache-files-dir 或设了 COMPOSER_DISABLE_NETWORK=1,它仍会尝试发起 HTTP 请求,报错典型为:Could not fetch https://repo.packagist.org/packages.json 或 file_get_contents(): failed to open stream。
它不支持 --offline 参数,也不认本地缓存路径,设计上就是在线工具。
离线机上怎么看到真实的依赖层级
前提是源机已执行过完整安装,且 vendor/ 目录已复制到离线机。此时可用以下方式还原结构:
-
composer depends --tree vendor/package-name:只查已安装的包,不联网,输出带缩进的树形(需 Composer ≥ 2.5) -
grep -r "require.*monolog" vendor/composer/installed.json | head -20:直接读已安装清单,看谁声明了该依赖 - 手动检查
vendor/composer/installed.json中的requires字段——每个包都记录了它自己的依赖项(不含版本约束,但有包名) - 若想可视化,可把
installed.json拷出来,在线用 Python 脚本转成 Mermaid 或 DOT 格式(离线机不执行这步)
离线前必须在联网机做的三件事
否则离线机上连基本结构都还原不了:
- 运行
composer install --no-dev --prefer-dist --optimize-autoloader,确保所有子依赖 ZIP 已落进cache-files-dir的/files子目录,且vendor/完整可运行 - 确认
composer.lock已提交,且未被手动修改(哪怕只改了一个空格,installed.json的哈希校验就会失败) - 在源机执行
composer show --tree --no-dev | tee deps-tree.txt,把树结构文本保存下来——这是唯一能“导出”的离线依赖视图
真正容易被忽略的是:installed.json 里的依赖关系是扁平化的,不体现传递深度;而 show --tree 输出的缩进层级,是 Composer 运行时动态计算出来的——离线后这个计算能力就没了。所以离线依赖树不是“配置出来”的,是“提前拍下来”的。


















