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

composer show 不联网能用吗
能,但得提前做好准备——composer show 本身不依赖实时网络,但它会尝试读取 vendor/composer/installed.json。只要这个文件存在且没被删,离线时也能列出已安装包。
常见错误现象:composer show 报错 Could not fetch packages information,其实是它误判了网络状态,或者 installed.json 损坏/缺失;不是命令本身必须联网。
- 确保项目已执行过至少一次
composer install或composer update(生成vendor/composer/installed.json) - 别手动删
vendor/composer/下的元数据文件 - 如果用了
--no-install或--dry-run,installed.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。