composer install 用的是 ~/.composer/cache(或 config 配置的 cache-dir)下的缓存,而非 vendor/;它依赖 archived/(原始 ZIP)、repo/(元数据 JSON)和 files/(dist 提取文件)三个子目录协同工作,缺一不可。

composer install 用的到底是谁的缓存?
它不直接读 vendor/,也不自己“造”缓存——composer install 完全依赖 ~/.composer/cache(或你通过 cache-dir 配置的路径)里已有的归档包和元数据。如果这个目录为空或缺失,它就退化成纯下载模式,速度骤降。
常见误解是认为 vendor/ 是缓存,其实它是安装产物;真正被复用的是 cache 下的 archived/(zip/tar 包)、repo/(Packagist 的 JSON 响应)、files/(提取后的临时文件)三个子目录。
-
archived/存的是原始压缩包,比如topthink/framework-8.0.5.zip,下次 install 直接解压,跳过下载 -
repo/里是https---packagist.org/packages.json这类文件,避免反复请求 API -
files/放的是软链接目标或提前提取的 dist 文件,用于加速 symlink 或 copy 模式安装
cache-dir 路径必须写绝对路径,不能用 ~
composer config --global cache-dir 后面跟的路径,不能写成 ~/.composer/cache。Composer 不做 shell 展开,会把它当字面量创建目录,结果就是真建了个叫 ~ 的子目录,后续所有操作都失败。
正确写法是:composer config --global cache-dir /home/runner/.composer-cache(Linux)或 composer config --global cache-dir C:\Users\CI\.composer-cache(Windows)。
- 执行前先确认当前生效路径:
composer config --global cache-dir,没输出说明用的是默认值 - 路径必须存在且当前用户有读写权限,否则
composer install会在写repo/时直接报failed to open stream - CI 环境中多个 job 并发跑,建议按 PHP 版本隔离缓存目录,比如
/tmp/composer-cache-${{ matrix.php-version }}
为什么 CI 中不该缓存 vendor/ 目录?
因为 vendor/ 不是纯静态产物:它的内容受 PHP 版本、启用的扩展(如 mbstring)、platform 配置、甚至 composer.json 里的 config.platform 影响。缓存它等于把一堆隐式依赖打包固化,极易导致“本地能跑、CI 报错”或“CI 能跑、但 autoloader 加载了错的类”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
典型现象包括:Class not found(因平台配置不一致导致某些包被跳过安装)、undefined function mb_strlen()(PHP 扩展未启用却加载了依赖该扩展的代码)。
- GitLab CI 必须显式设置
COMPOSER_CACHE_DIR环境变量,否则cache:声明的路径无效,Composer 仍写入默认~/.composer/cache - GitHub Actions 缓存键必须含三要素:
hashFiles('**/composer.lock')+${{ matrix.php-version }}+hashFiles('**/composer.phar'),缺一不可 - 缓存路径写
~/.composer/cache是错的,应该写实际路径,比如$HOME/.composer/cache或/home/runner/.composer/cache
archive-dir 和 cache-dir 完全是两回事
archive-dir 控制的是 vendor/composer/archives 这个位置——它只在 composer install 使用 dist 方式(即解压 zip)时,把临时解压出来的文件放哪。它不影响下载缓存行为,也不参与 CI 缓存决策。
想改它,不能用命令行参数(--archive-dir 不存在),只能写进项目 composer.json 的 config 字段:
{
"config": {
"archive-dir": "build/archives"
}
}
这个路径是相对于项目根目录的,且只影响当前项目;而 cache-dir 是全局配置,影响所有命令。
-
archive-dir修改后,下次composer install才生效,不会迁移已有文件 - 它和
cache-dir没有从属关系,cache-dir/archived/存的是原始 zip,archive-dir/存的是解压后的内容 - 多数项目根本不需要动
archive-dir,除非你明确要隔离解压产物(比如构建时需要清理临时文件)

















