Composer 不会自动为 vendor 目录下的包名添加哈希,包目录名始终为 vendor/name,哈希仅用于 lock 文件校验和 dist 下载 URL;需手动重命名 vendor 目录实现哈希隔离。

composer install 和 update 时包名不会自动生成哈希
Composer 本身不给包名(如 vendor/package)追加哈希,它依赖的是 composer.lock 中记录的精确版本(含 commit hash 或 dist sha256),而非修改包目录名。所谓“带哈希的包名”,通常是构建流程或部署脚本手动重命名的结果,不是 Composer 原生行为。
dist 包下载时的哈希体现在 URL 和校验中
当包使用 "dist" 方式分发(如 zip 包),Composer 会从 composer.lock 读取 sha256 值做完整性校验,同时下载链接里常含 commit hash(例如 https://api.github.com/repos/vlucas/phpdotenv/zipball/5a014e9e7d8990c453b05f0f215b45934109e076)。这个 hash 是 Git commit ID,用于锁定源码快照,但不会反映在本地 vendor/ 目录结构里。
-
composer install优先用composer.lock中的dist.sha256校验已下载的 zip -
composer update会更新 lock 文件中的 hash,并重新下载新 commit 的 dist 包 - 若项目配置了
"preferred-install": "dist",则更频繁触发带 hash 的 zip 下载
想让 vendor 目录带哈希?得自己后处理
如果你需要类似 vendor-abc123/ 这样的隔离式目录(常见于 CI 构建缓存或灰度发布),必须在 composer install 后手动操作,比如:
composer install --no-dev --optimize-autoloader git rev-parse --short HEAD > .commit-hash COMMIT=$(cat .commit-hash) mv vendor "vendor-$COMMIT"
注意:autoload.php 路径、CI 脚本里的路径引用、以及某些插件(如 hirak/prestissimo)都可能因 vendor 目录改名而失效,需同步调整。
别混淆:package name ≠ version hash
Composer 的 name 字段(如 "monolog/monolog")是固定字符串,由包作者定义;而实际安装的代码快照由 version + source.type + source.reference(Git commit)或 dist.shasum 共同锁定。你在 composer show monolog/monolog 看到的 versions 列表里,dev-main 或 2.10.x-dev 这类分支别名背后,真正生效的是它指向的那个 commit hash —— 但这个 hash 不会出现在文件夹名里。
最易被忽略的一点:vendor/ 目录本身无状态,它的可信性完全依赖 composer.lock 的完整性与校验逻辑。删掉 lock 文件再 install,哪怕 git commit 没变,也可能因网络拉取时机不同导致 dist 包 checksum 不一致而失败。










