composer.json 配置必须精准:require 与 require-dev 分离运行时与开发依赖,psr-4 自动加载需严格匹配命名空间与目录结构(如 "App\\": "src/"),scripts 命令应使用 vendor/bin 下可执行文件,composer.lock 是协作必需的依赖快照。

composer.json 不是“写对就行”的配置文件,它直接决定依赖能否正确安装、自动加载是否生效、包能否被他人复用——错一个字段名或缩进层级,composer install 就可能静默失败或加载不到类。
require 和 require-dev 怎么分?别把测试工具打进生产包
这两个字段控制依赖的安装范围,但很多人误以为只是“开发用/不用”,实际影响的是 composer install --no-dev 的行为(线上部署常用)。
-
require:运行时必需的依赖,比如"monolog/monolog": "^2.8"—— 没它,你的日志功能就崩 -
require-dev:仅本地开发或测试需要的,比如"phpunit/phpunit": "^10.5"或"friendsofphp/php-cs-fixer": "^3.14" - 如果把
phpunit写进require,上线执行composer install --no-dev会跳过它,但你的autoload-dev可能还引用了它,导致Class not found - 版本号建议用
^(如"^8.1"),避免锁定死版本;慎用*或dev-main,CI 构建可能因分支变动而失败
autoload 字段怎么写才让 new App\Http\Controller\Home() 找得到?
自动加载不是“声明了就自动生效”,它取决于命名空间路径映射是否与物理目录结构严格一致。
-
"psr-4": {"App\\": "src/"}表示所有以App\开头的类,都去src/目录下按命名空间子目录查找(如App\Http\Controller\Home→src/Http/Controller/Home.php) - 注意结尾反斜杠必须是双反斜杠
\\,单斜杠\在 JSON 中是非法转义 - 如果用
classmap,需手动运行composer dump-autoload -o生效;而psr-4修改后只需composer dump-autoload(无-o)即可热更新 - 不要混用
psr-4和psr-0,后者已废弃;也别把vendor/加进 autoload —— Composer 会自动处理它
scripts 字段里写命令,为什么 composer test 执行不了?
scripts 是快捷命令别名,但它的执行环境受限,不等价于直接在 shell 中运行。
- 脚本默认在项目根目录执行,所以
"test": "phpunit tests/"要求phpunit已全局安装,或改用./vendor/bin/phpunit - 推荐写成
"test": "vendor/bin/phpunit --colors=always",避免依赖全局 PATH - 可以链式调用:
"post-install-cmd": ["@php artisan clear-compiled", "composer dump-autoload"],但注意顺序和错误中断行为 - 自定义脚本名不能和 Composer 内置命令冲突(如
install、update),否则会被覆盖
最常被忽略的是 composer.lock 文件的协作意义:它不是生成物,而是依赖状态的快照。多人开发时,删掉它再 composer install,很可能装出和队友不一样的次要版本——尤其当 require 用了 ^ 且上游发布了新 patch 版本时。










