composer 无命令直接列出已缓存包,唯一可靠方式是查看 composer diag 输出的 cache directory 下 files/ 子目录结构,其中每个 vendor/name/ 文件夹对应一个已缓存包。

Composer 没有命令能直接列出“已缓存的包列表”,所有声称能一键查缓存包的命令(如 composer show、composer cache:list)都不存在或无效。 唯一可靠方式是进缓存目录手动看 files/ 子目录结构——它按 vendor/name/ 组织,每个子目录名对应一个被缓存过的包。
怎么确认 Composer 当前真在用哪个缓存目录?
别信 composer config cache-dir 的输出,它只显示配置值,不反映实际生效路径。运行:
composer diag
关注输出中 Cache directory 这一行,这才是 Composer 此刻真实读写的路径。常见干扰项:
-
COMPOSER_CACHE_DIR环境变量优先级最高,设了就绕过所有 config - Linux/macOS 下默认是
~/.composer/cache,但若$HOME/.cache/composer可写,它会 fallback 到那里 - Windows 下默认是
%LOCALAPPDATA%\Composer\cache,不是%APPDATA% - 权限不足时(比如
sudo composer install写入 root 缓存),普通用户后续无法读取,composer diag会报Cache is not working due to permissions
缓存内容在哪、怎么看出哪些包被缓存了?
进入 composer diag 显示的 Cache directory,重点看 files/ 目录:
-
files/下的每一级子目录都是vendor/name/形式,例如monolog/monolog/、guzzlehttp/guzzle/—— 这就是你缓存过的包名 - 每个
vendor/name/下是多个 hash 命名的文件夹(如9a1e65d784c06b59715ac4f268af728b/),每个代表该包的一个版本(dist 包) -
repo/存的是元数据 JSON,不影响“是否缓存了某包”,只影响能否搜到新版本 -
archives/在 Composer ≥ 2.2 中已弃用,不用管
快速确认某个包是否在缓存中:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
find ~/.composer/cache/files -type d -name "monolog"
或 Windows 下:
dir /s %LOCALAPPDATA%\Composer\cache\files\monolog
为什么 composer show --all 不等于“查看缓存包”?
composer show --all guzzlehttp/guzzle 查的是 Packagist 上所有公开版本,和本地缓存无关;它走网络请求,不是读磁盘。真正体现“缓存是否命中”的只有安装过程中的终端输出:
- 看到
Downloading https://repo.packagist.org/p2/guzzlehttp/guzzle.json→ 元数据从缓存repo/读(如果没过期) - 看到
Writing /path/to/cache/files/guzzlehttp/guzzle/xxx.zip into cache或Using version ^7.8 for guzzlehttp/guzzle并跳过 Download 行 → dist 包从files/缓存加载 -
--offline模式下失败,报Package guzzlehttp/guzzle has no cached version→ 说明files/里真没这个包的 zip
想清理某个包的缓存,又不想全删?
composer clear-cache 是全量清空,不支持过滤。安全做法是手动删 files/vendor/name/ 整个目录:
- 先确认当前项目装的是哪个版本:
composer show guzzlehttp/guzzle - 再进
~/.composer/cache/files/guzzlehttp/guzzle/,找对应 hash 文件夹删掉(hash 通常和 dist URL 的 SHA256 一致) - 删完不影响其他包,下次
composer install会重新下载该包并写入新缓存 - 别删
repo/下的整个packagist.org%目录,否则所有包元数据丢失,首次 update 会明显变慢
缓存本质是 key-value 存储,没有索引表,也没有“包名→所有缓存版本”的映射。你得自己翻目录,或者写脚本遍历 files/ —— 这是 Composer 设计决定的,不是操作疏漏。










