必须用 composer show -s 查已安装包的 source 类型(git/zip/path),默认不显示;该命令输出 type、url、reference,未安装则报错“Package not installed”,且结果以 composer.lock 记录为准。

Composer 包的 source 类型(git/zip/path)必须用 composer show -s 查,composer show 默认不显示,也不能靠 vendor 目录结构或 .git 存在与否来判断。
用 composer show -s 看已安装包的真实 source 类型
这个命令会强制输出包的原始来源信息,包括 type、url 和 reference。只有已安装的包才有效,未安装时会报错 “Package not installed”。
-
type: git表示该包是通过 Git 克隆下来的,vendor 里有.git目录,可直接git log或git status -
type: zip表示走的是 dist 分发,vendor 里只有解压后的文件,没有版本控制信息 -
type: path表示用了pathrepository,vendor 里是符号链接,指向你本地某个开发目录 - 如果输出里根本没有
source字段,只看到dist,说明这个包没配置 source,或者被强制走 dist(比如"preferred-install": "dist")
别信 vendor 里的 .git/config,它可能根本不存在或不可靠
很多人进 vendor/foo/bar/.git/config 看 remote.origin.url 来判断源地址,但这个做法有硬伤:
- 如果
composer install --prefer-dist或全局配置了"preferred-install": "dist",vendor 下压根没.git目录 - 如果包是
path类型,.git/config里写的可能是你本地路径,不是远程仓库地址 - 某些私有 Git 仓库用 SSH URL(如
git@github.com:user/repo.git),但.git/config里写的是 SSH 地址,而composer show -s输出的是原始composer.json中声明的source.url(通常是 HTTPS)
composer config 查不到包的 type,只能查镜像和仓库配置
composer config 系列命令管的是 Composer 自身行为配置(比如用哪个镜像、vendor 放哪),和单个包的分发类型无关。常见误操作:
-
composer config repo.packagist.org.url→ 查的是元数据源地址,不是某个包的下载方式 -
composer config --list | grep repo→ 只能列出你配过哪些自定义仓库,不能告诉你 monolog/monolog 是从 git 还是 zip 装的 -
composer diagnose→ 检查环境连通性,不输出任何包的 source 类型
为什么 type 不同会影响日常操作?
source 类型决定了你能做什么、不能做什么,不是纯理论区分:
- 想改包代码并提 PR?只有
type: git才能直接git commit;type: zip改了也没法 push - CI 流程中执行
git diff或检查 commit hash?type: zip下无 .git,命令直接失败 - 本地开发时用
path替换包,但忘记在composer.json里加"repositories": [{"type": "path", "url": "../my-local-package"}],会导致composer show -s根本不显示source字段 -
composer update时,type: git会git fetch,而type: zip是重新下载整个压缩包——网络差时延迟明显不同
最易忽略的一点:composer show -s 的输出取决于当前 composer.lock 记录的安装方式,不是 composer.json 里写的版本约束。比如你写了 "monolog/monolog": "^3.0",但 lock 文件里记的是 dist 方式安装的,那 -s 就不会显示 source —— 即使那个包本身在 Packagist 上明明有 Git 仓库。


















