composer init 仅生成 composer.json 文件,不创建目录、不安装依赖、不配置 autoload、不生成 vendor/ 及 vendor/autoload.php。

composer init 只生成 composer.json,不创建目录、不安装包、不写 autoload、不建 vendor/。你执行完就去 require 'vendor/autoload.php',报错是必然的——它根本没生成那个文件。
composer init 生成什么、不生成什么
它只是把你在交互中填的字段(或参数)原样转成 JSON 写进 composer.json,其他一概不管:
- 不会创建
src/、tests/、public/等任何目录 - 不会运行
composer install,所以vendor/和vendor/autoload.php都不存在 - 不会自动探测已有类或命名空间,更不会帮你配
autoload - 不会校验 PHP 版本兼容性,也不会检查
require里的包是否存在
常见错误现象:Class not found 却发现 composer.json 根本没有 autoload 字段;或者 composer install 报 No matching package found,其实是 require 里写了 monolog/monolog:^3.0,但当前 PHP 是 7.4 —— init 不管这个。
交互式 init 容易踩的三个硬坑
交互流程看着简单,但每步填错都会导致后续失败:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
Package name必须是vendor/name格式,比如acme/cli-tool;填myapp或MyApp直接报Invalid package name -
Author必须带邮箱且格式正确:John Doe <john></john>;中文邮箱、缺、空格错位都会让composer validate失败 - 问到
Would you like to define your autoload rules?时选yes,它只支持classmap,**不支持 PSR-4**;想用命名空间自动加载,必须手动改composer.json加"psr-4": {"App\": "src/"}
非交互初始化怎么写才不翻车
脚本、CI、批量建项目必须用 --no-interaction,但它不兜底,缺一个参数就退出:
-
--name和--author是必需的,漏掉直接失败;推荐写法:composer init --no-interaction --name="myorg/myapp" --author="Me <me>"</me> -
--autoload必须传完整 JSON 字符串,且用单引号包裹,双反斜杠不能少:--autoload='{"psr-4":{"App\":"src/"}}';写成"App":"src/"会被 shell 提前解析,JSON 无效 -
--require要拆开写,每个依赖单独一个--require参数:--require="php:^8.1" --require="guzzlehttp/guzzle:^7.8";合并或漏版本号(如guzzlehttp/guzzle)会报Could not parse version constraint
生成后立刻要做的三件事
别急着写代码,先确认基础是否立住:
- 立刻跑
composer validate:它能秒级发现name缺 vendor 段、license是空值、JSON 有全角引号等硬伤 - 确认
type字段:本地 CLI 工具或网站填"type": "project";只有明确要发布为别人require的库,才设"type": "library";填错会导致 autoload 不生效或 CI 拒绝构建 - 补完
autoload后必须手动运行composer dump-autoload:仅install或update不会重建自动加载映射;路径写错(如"src/"但实际目录叫lib/)、命名空间末尾少一个反斜杠("App"而非"App\"),都会让class_exists()返回false
最常被忽略的是:改了 autoload 不跑 dump-autoload,或者路径用了 ./src/ 这种相对写法——Composer 只认项目根目录下的 src/,多一个点、少一个斜杠,映射就失效。










