composer镜像仓库不存包,真正占用磁盘和inodes的是本地cache/files/和vcs/目录;“僵尸包”指未被任何composer.lock引用的zip或git裸仓库,需结合锁文件提取dist.shasum与缓存文件实际sha256比对识别,不可按文件名或时间删除;vcs/需手动清理或禁用cache.vcs。

Composer 镜像仓库本身不存包,真正吃磁盘和 inodes 的是本地 cache/ 目录里的 files/ 和 vcs/;所谓“僵尸包”其实是没被任何 composer.lock 引用的 ZIP 归档或 Git 裸仓库,无法靠 Composer 自动识别,必须结合锁文件扫描 + 文件哈希比对来清理。
怎么识别哪些 ZIP 包是“僵尸”——只看文件名没用
镜像缓存里 cache/files/ 下的文件名形如 monolog/monolog/123abc456.zip,但这个 hash 不是包内容哈希,而是 Composer 内部生成的元数据摘要,不同版本可能撞 hash,同一版本在不同镜像源下也可能不同。所以不能按名字删、也不能按修改时间删。
- 正确做法:遍历当前所有项目的
composer.lock,提取"dist": {"shasum": "..."}字段,再跟cache/files/里实际文件的 SHA256(不是 shasum)做比对——只有完全没匹配上的 ZIP 才算真僵尸 - 快捷替代:用
composer-unused --no-dev --scan-path=.先扫代码引用,再结合composer depends --tree确认无依赖链,最后手动删对应 ZIP - 别信
ls -t | tail -n +100这类时间排序——老项目重建时会重下旧包,时间戳反而新
为什么 composer clear-cache 清不掉 vcs/ 里的 Git 裸仓库
composer clear-cache 默认只清 files/ 和 repo/,vcs/ 是故意被跳过的:因为 Composer 认为裸仓库是“可复用资源”,下次 update --prefer-source 可能还要用。但它每克隆一个包就建一个完整 .git,300–800 MB + 数千个文件,inodes 消耗极快。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 安全清法:
rm -rf $(composer config --global cache-dir)/vcs/*(Linux/macOS),Windows 上进%APPDATA%\Composer\Cache\vcs\全删 - 一劳永逸:
composer config --global cache.vcs false,之后所有包强制走--prefer-dist,不再生成裸仓库 - 注意:禁用后首次
composer update会慢,因要重下所有 dist 包;但后续不再偷偷吃 inodes,且避免 SSH/Git 配置缺失导致的中断
composer update --refresh 和清缓存的区别在哪
composer update --refresh(≥2.5)只丢弃 cache/repo/ 下的 packages.json 和 provider-*.json,不碰 ZIP、不删裸仓库、不重装任何包;而 clear-cache 是全盘清,包括已下载的 dist 包,下次 install/update 得全部重下。
- 适用场景:
--refresh专治“镜像站已有新版本但本地死活拉不到”——比如你确认monolog/monolog已发 3.6.0,但composer update monolog/monolog仍显示 “Nothing to install or update” - 前提条件:确保
composer config -g repo.packagist输出的是你期望的镜像地址(如https://mirrors.aliyun.com/composer/),否则--refresh会去错地方拉元数据 - 老版本 Composer(≤2.4)不支持该参数,只能手动删
cache/repo/子目录,或临时用COMPOSER_CACHE_DIR=/dev/null composer update
真正难清理的从来不是 ZIP 或裸仓库本身,而是那些被多个项目共用、但又没出现在任一 composer.lock 里的中间版本——它们不会报错,但会持续占用空间;手动删风险高,自动化脚本必须带锁文件白名单校验,否则容易误伤。










