composer.json需严格匹配项目类型、PHP版本、自动加载及依赖稳定性;require为运行时依赖,require-dev仅开发期使用;推荐^版本约束;autoload须显式配置psr-4或classmap并执行dump-autoload。

直接说结论:composer.json 不是“写出来就行”,而是要匹配项目类型、PHP 版本约束、自动加载规则和依赖的稳定性要求;写错一个字段(比如把 require 写成 requires)会导致 composer install 报错或依赖不装。
require 和 require-dev 怎么区分用?
这两个字段决定哪些包会被安装,但用途完全不同:
-
require里的包是运行时必需的,比如"monolog/monolog": "^2.0"—— 你的代码里调用了Monolog\Logger,没它就 fatal error -
require-dev是开发期才需要的,比如"phpunit/phpunit": "^9.5"或"friendsofphp/php-cs-fixer": "^3.0"—— CI 流水线跑测试或格式化时才用,生产环境composer install --no-dev会跳过它们 - 别把测试工具写进
require,否则线上也会装 PHPUnit,既浪费空间又可能引入安全风险 - 版本号推荐用
^(如"^8.1"),它允许小版本升级(8.1.0 → 8.1.5),但禁止主版本跃迁(8.1.x → 9.0.0)
autoload 字段怎么配才能让类自动加载?
Composer 默认只加载 vendor/autoload.php,你自己的类不会被识别——必须通过 autoload 显式声明。常见方式有:
-
"psr-4":最常用,按命名空间映射目录,例如:{ "autoload": { "psr-4": { "App\\": "src/", "Tests\\": "tests/" } } }注意末尾斜杠不能少,"App\\"中的双反斜杠是 JSON 转义必需的 -
"classmap":适合老项目或非标准结构,扫描指定目录下所有.php文件并生成类名→路径映射,例如:"autoload": { "classmap": ["lib/", "legacy/"] }执行composer dump-autoload才会更新映射表 - 别漏掉
autoload-dev:测试类通常不在主psr-4规则里,单独配更清晰"autoload-dev": { "psr-4": { "App\\Tests\\": "tests/" } }
name、type、minimum-stability 这几个字段有什么实际影响?
它们不直接影响依赖安装,但决定了 Composer 如何解析和发布包:
-
name格式必须是vendor/name(如"myorg/myapp"),否则无法作为私有包被其他项目require;本地项目可随便写,但一旦推到 Packagist 就必须全局唯一 -
type默认是"library",如果是 Laravel 应用,建议设为"project",这样某些工具(如laravel/installer)能正确识别上下文 -
minimum-stability控制默认依赖版本策略,默认是"stable",意味着"monolog/monolog": "*"只会装v2.10.0这类稳定版;设为"dev"后可能装到dev-main分支,CI 构建容易失败;更稳妥的是留默认值,对个别包显式加-dev后缀,例如:"require": { "some/package": "dev-feature-branch as 1.2.0" }
最容易被忽略的是 autoload 配置后没运行 composer dump-autoload,或者改了 psr-4 映射却忘了删 vendor/composer/autoload_psr4.php 缓存文件——这时候 Class not found 错误根本不是代码问题,而是 autoload 没生效。










