Composer.json 字段并非全部可在运行时读取,PHP 代码需手动解析文件;autoload 和 config 等字段仅作用于 Composer 工具本身,不暴露给运行时,且 require/require-dev 在安装后无区分。

composer.json 字段不是全都能被运行时读取
Composer 本身在安装、更新时会解析 composer.json,但 PHP 代码里想读取这些配置,得靠自己加载和解析——Composer 没提供统一的 Runtime API 去暴露全部字段。你不能写 Composer::getConfig('require') 这种调用,它根本不存在。
常见误区是以为 vendor/composer/installed.json 或 composer.lock 能反推原始配置,但它们只存解析后的结果(比如 resolved package versions),不保留 config、scripts、autoload 等原始结构。
- 最可靠方式:用
json_decode(file_get_contents('composer.json'), true)手动读取,但要注意路径问题——得先定位到项目根目录 - 不要硬编码
./composer.json,因为执行脚本的位置可能任意;应从getcwd()向上遍历,直到找到composer.json或到达磁盘根目录 - 如果项目用了
COMPOSER环境变量指定了配置文件名(如COMPOSER=composer-dev.json),那必须读这个文件,而不是默认名
autoload 和 config 字段最容易被误读
autoload 里的 PSR-4 映射(如 "App\": "src/")只是给 Composer 自己生成自动加载器用的,PHP 运行时不会自动加载这些命名空间——除非你已执行过 composer dump-autoload 并引入了 vendor/autoload.php。
config 字段下的值(如 "sort-packages": true、"cache-dir": "./.cache")只影响 Composer 命令行为,PHP 代码里完全不可见,也不会写入任何运行时环境变量或常量。
- 想在代码里用
sort-packages的值?不行,它只控制composer.json格式化输出顺序 -
"process-timeout": 3600是给 Composer 自己用的超时设置,不影响你的exec()或shell_exec() - 若需让应用感知某些配置,得手动把它们复制进
.env或单独的config/app.php,别指望 Composer 替你桥接
require 和 require-dev 在运行时不可区分
require 和 require-dev 是 Composer 安装阶段的指令,一旦包装进 vendor/,PHP 就不再知道某个类来自哪个字段——所有自动加载规则都合并进了 vendor/autoload.php。
这意味着:monolog/monolog 放在 require-dev 里,只要它被 autoload 加载了,生产环境也能用(只要没删 vendor);反过来,放 require 里的包,开发时也照样能用。
- 真正隔离依赖的只有
composer install --no-dev这个命令,它决定是否把require-dev下的包装进vendor/ - 运行时判断“当前是否 dev 环境”,得靠
getenv('COMPOSER_DEV_MODE')或自定义环境变量,不是读composer.json -
composer.json里写"require": {"php": ">=8.1"}是安装校验用的,PHP 运行时不会检查这个,也不会报错
repositories 和 plugins 配置无法被代码直接访问
repositories 字段(如自定义 VCS 源、path 类型本地包)只在依赖解析阶段起作用,解析完成后就丢弃了;plugins 同理——它们是 Composer 生命周期早期的输入参数,不是运行时状态。
即使你写了 "repositories": [{"type": "path", "url": "../my-local-package"}],PHP 代码里也拿不到这个路径,更无法据此动态 require 本地包。
- 要让代码加载本地包,得走标准自动加载流程:确保该包有合法
composer.json,且其autoload已被composer dump-autoload注册 - 不要试图在代码里
file_get_contents('../my-local-package/composer.json')——路径不可靠,权限可能受限,且违反封装原则 - 如果真需要运行时发现包信息,应查
vendor/composer/installed.php(PHP 数组格式)或vendor/composer/installed.json(JSON 格式),里面含已安装包的 name、version、install-path 等,但不含原始repositories配置
require)、工具行为开关(如 config.sort-packages)、元数据声明(如 autoload)。它们各自生命周期不同,没有统一入口可读。硬要在一个地方取全,反而容易绕进路径、权限、缓存、环境变量覆盖的坑里。


















