composer如何在无网络时查看已安装包列表?

2次阅读

能,composer show 本身不依赖实时网络,只要 vendor/composer/installed.json 文件存在且有效,即可离线列出已安装包;该文件由 composer install/update 生成,是当前 vendor 包的元数据快照。

composer如何在无网络时查看已安装包列表?

composer show 不联网能用吗

能,但得提前做好准备——composer show 本身不依赖实时网络,但它会尝试读取 vendor/composer/installed.json。只要这个文件存在且没被删,离线时也能列出已安装包。

常见错误现象:composer show 报错 Could not fetch packages information,其实是它误判了网络状态,或者 installed.json 损坏/缺失;不是命令本身必须联网。

  • 确保项目已执行过至少一次 composer installcomposer update(生成 vendor/composer/installed.json
  • 别手动删 vendor/composer/ 下的元数据文件
  • 如果用了 --no-install--dry-runinstalled.json 不会生成,离线就真看不到列表了

离线时如何确认 installed.json 是否可用

直接检查文件是否存在、是否可读,比猜更可靠。这个文件是 Composer 安装后写入的“快照”,内容就是当前 vendor 里所有包的 name/version/type 等信息。

使用场景:CI 构建后打包镜像、内网服务器部署、飞行模式调试。

  • 运行 ls -l vendor/composer/installed.json,确认文件存在且大小 > 0
  • cat vendor/composer/installed.json | head -n 5 快速看前几行是否是合法 JSON
  • 如果项目用的是 Composer 2.x,还可能有 installed.php(二进制缓存),但 show 命令默认仍走 JSON

composer show 的常用离线参数组合

离线时别乱加参数——有些选项会触发远程请求,比如 --outdated--tree(后者在某些旧版本会尝试查 lock 文件外的包)。

安全、真正离线可用的组合只有这几个:

  • composer show:列出全部已安装包(name + version)
  • composer show --platform:只看 PHP 扩展和平台包(如 ext-curl),完全不碰 vendor
  • composer show monolog/monolog:查单个包详情(只要它在 installed.json 里就有)
  • 避免用 --all(已废弃)、--direct(部分版本仍会联网校验)

为什么有时候离线 show 会卡住或报错

不是网络问题,而是 Composer 在初始化阶段做了隐式行为:比如读取全局配置、检查 CA 证书路径、甚至尝试访问 ~/.composer/auth.json(哪怕只是 stat())。这些在无网络但文件系统正常的机器上不该失败,但某些容器环境或权限收紧的系统会暴露问题。

性能与兼容性影响:Composer 1.10+ 对离线响应做了优化,但若 COMPOSER_HOME 指向一个不可写的路径,它可能反复重试写日志,造成假卡顿。

  • 临时解决:加 -n(非交互)和 --no-plugins 避免插件触发额外逻辑
  • 终极保险:用 php -r "echo json_encode(json_decode(file_get_contents('vendor/composer/installed.json'), true), JSON_PRETTY_PRINT);" 绕过 Composer 二进制
  • 注意 windows 上路径分隔符和权限问题,installed.json 可能被防病毒软件锁定

最易被忽略的一点:composer.lock 文件存在 ≠ installed.json 存在。lock 是声明,installed.json 是事实——没 install 过,离线就真没得 show。

text=ZqhQzanResources