composer.json不是配置文件而是依赖契约,必须执行composer install或dump-autoload才生效;require放生产必需包(如monolog/monolog),require-dev放开发工具(如phpunit/phpunit),autoload需正确映射命名空间与路径并执行dump-autoload,name字段必须为全小写vendor/name格式。

composer.json 不是“写完就能用”的配置文件,它必须配合 composer install 或 composer dump-autoload 才生效;漏掉这一步,自动加载和依赖都不会工作。
require 和 require-dev 到底该放什么?
这两个字段不是按“重要不重要”来分的,而是按 运行时环境 划分:
-
require里的包,必须能在生产环境(比如线上服务器)中正常加载和执行,例如"monolog/monolog": "^3.0"、"php": ">=8.1" -
require-dev里的包,只在本地开发或 CI 流程中用到,比如"phpunit/phpunit": "^10.5"、"nunomaduro/larastan": "^2.9";它们不会随composer install --no-dev被装上 - 误把开发工具放进
require,会导致线上环境多装无用包,还可能因扩展缺失(如pcov)直接报错 - 反过来,把运行时必需的类库(如
league/flysystem)错放到require-dev,composer install --no-dev后会直接Class not found
autoload 中 PSR-4 配置常见错法
PSR-4 映射写错,最常导致 Class not found 却查不出原因。关键点不在路径对不对,而在 命名空间与目录结构的对应关系:
- 配置
"App\": "src/",意味着AppFooBar类必须位于src/Foo/Bar.php(注意:没有App目录层) - 如果实际文件在
src/App/Foo/Bar.php,那映射应为"App\": "src/App/",否则自动加载器根本不会去那个路径找 - 命名空间末尾的双反斜杠
\不能省——"App"是非法 JSON 字符串,"App\"才对 - 改完
autoload后,必须运行composer dump-autoload,否则变更不生效;composer install不会重新生成 autoload 文件
name 字段不是可选的“元信息”,而是 root 包身份标识
很多人以为 name 只是发布包才需要,其实只要项目是 root 包(即你正在开发的那个项目),它就承担着关键角色:
- 没有
name,composer install仍能跑,但所有自定义脚本(scripts)、插件(allow-plugins)和部分仓库行为会受限或失效 - 某些 IDE(如 PHPStorm)依赖
name推断项目根和自动补全上下文 - 格式必须是
vendor/name,且全部小写、仅含字母数字和-._;my-project合法,MyProject或my project会触发警告甚至阻断安装 - 如果你用
composer create-project初始化项目,它会强制要求填name;手动创建时跳过,后续很可能踩进插件兼容性坑里
真正容易被忽略的是:composer.json 里任何字段的修改,几乎都不“热生效”。哪怕只是加了个空格,也得重新运行对应命令——require 改了要 install/update,autoload 改了要 dump-autoload,scripts 改了要重新注册。没走这一步,配置就是废纸。


















