composer show --self 查的是当前项目自身(即 composer.json 中定义的 root package)的元数据,输出完全源自本地 composer.json 字段解析,不读 composer.lock 也不查 vendor/ 状态,可显示 name、description、require 等字段,但 version 通常不显示。

composer show --self 到底查的是谁的信息?
它查的是当前项目自身(即 composer.json 中定义的 root package)的元数据,不是 Composer 工具本身的版本,也不是已安装依赖的版本 —— 这是最多人混淆的一点。如果你在项目根目录下运行 composer show --self,输出内容完全来自本地 composer.json 文件的字段解析,不读 composer.lock,也不查 vendor/ 里的实际安装状态。
它能显示哪些字段?哪些永远不显示?
能显示的字段取决于你 composer.json 里写了什么,常见有:name、description、type、license、authors、require(只列约束,如 "php": "^8.1")、autoload 配置等。
-
version字段即使写了,也大概率不显示 —— Composer 认为 root package 没有“固定版本”,除非你打 Git tag 或靠composer.lock间接推断 - 实际安装的依赖版本、插件(plugins)、脚本(
scripts全部键名)、仓库(repositories)配置,统统不会出现 -
require-dev会列出约束,但不会标注“这是 dev 依赖”;也不会告诉你这些包是否真被装进 vendor/ 了
什么时候该用它?什么时候不该用?
适合快速核对项目基础定义是否写全、命名是否一致、autoload 映射是否按预期声明 —— 尤其在 CI/CD 脚本里做预检时很轻量。
- ✅ 查
autoload是否配置了"App\\": "src/",避免 PSR-4 加载失败 - ✅ 确认
name字段是否符合私有 Packagist 的命名规范(如myorg/myapp) - ❌ 想知道 “
guzzlehttp/guzzle装的是不是 7.5.0?” → 改用composer show guzzlehttp/guzzle - ❌ 想确认当前项目“实际发布版本号” → 它给不了,得看 Git tag 或
composer.lock里的packages或packages-dev条目
和 composer show、composer info 的关键区别
composer show --self 和 composer info --self 输出几乎一样,因为 info 是 show 的别名;但 composer show(无参数)默认列出所有已安装依赖,行为完全不同。
- 旧版 Composer(composer.json),
composer show --self会报错Could not find package with name "self",而不是静默跳过 - 想查“整个依赖树”,必须用
composer show --tree,加--self后这个选项无效 - 如果误以为
--self能暴露 Composer 自身版本(比如 2.7.0),那是错的 —— 那是composer --version或composer global show composer/composer的职责
真正容易被忽略的是:它不反映运行时真实状态。一个 composer.json 写着 "monolog/monolog": "^3.0",但 composer show --self 不会告诉你现在装的是 3.5.0 还是 2.10.0 —— 它只忠于 JSON 文件的文本定义,仅此而已。










