composer init仅生成空壳composer.json,不安装包、不建vendor目录、不配置autoload;包名必须为vendor/name格式,否则报错,且需手动运行composer validate和install。

composer init 不创建项目,只生成一个空壳 composer.json;它不装包、不建 vendor/、不配自动加载——填错关键字段,后续 composer install 或 class not found 就是必然结果。
Package name 必须含 /,否则直接报错
交互式运行 composer init 时,第一步 “Package name” 输入 myapp 会卡住并提示 Invalid package name "myapp"。Composer 强制要求格式为 vendor/name,比如 acme/blog 或 myorg/cli-tool。
常见错误现象:
目录名含空格(My Project)、大写字母(MyApp)或特殊符号(my-app!),会导致自动推导失败,命令卡死。
- 解决办法:初始化前先重命名目录,或直接用
--name="myorg/myapp"跳过提问 - Git 用户名带中文或空格时,
composer init可能读取并生成非法包名,建议一律显式传--name - 漏 vendor 段、用下划线开头、含大写字母,都会让
composer validate失败,CI 流水线中断
autoload 不填就留空,PSR-4 必须手动加
交互流程中问到 Would you like to define your autoload rules?,选 yes 后只支持 classmap,**不支持 PSR-4**——这是个长期存在的设计限制。如果你的类在 src/ 下且用 App 命名空间,不手动加配置,composer dump-autoload 就不会注册任何映射。
非交互模式下必须整段 JSON 传入:composer init --autoload='{"psr-4":{"App":"src/"}}' --no-interaction
- 注意反斜杠要双写:
App\,否则 JSON 解析失败 - 路径填错(比如写成
lib/但实际类在src/)会导致class_exists()返回false - 即使
require为空,也得执行一次composer install,否则vendor/autoload.php不会出现
非交互模式下参数缺一不可,没默认值兜底
--no-interaction 不是“跳过所有”,而是“全靠你填齐”。缺 --name 或 --author,命令直接退出,连预览都不给。
最小可用命令示例:composer init --no-interaction --name="myorg/myapp" --author="Me <me>" --type=project --require="php:^8.1"</me>
-
--require必须带版本约束:guzzlehttp/guzzle:^7.8合法,guzzlehttp/guzzle会报Could not parse version constraint - 多个依赖要拆开写:
--require="foo/bar:^1.0" --require="baz/qux:^2.0",不能合并成一个字符串 -
--type=project是普通应用的推荐值;选library会触发 Packagist 兼容检查,徒增 CI 报错风险
生成后必须立刻跑 composer validate
composer init 生成的 composer.json 只是文本,不校验合法性。很多硬伤要等 composer install 才暴露,比如:name 缺 vendor 段、license 格式不对(MIT 合法,mit 不合法)、authors 缺邮箱。
这些都可通过 composer validate 提前发现。它不联网、不装包,秒级完成。
- 老项目迁移时,别信交互式流程的“默认值”——目录叫
legacy-site,就该填acme/legacy-site,不是legacy-site -
minimum-stability填dev却没配prefer-stable: true,可能导致composer require拉取意外的 dev 分支 - PHP 版本约束(如
php:^8.1)和当前运行环境不匹配,composer install会直接退出,而不是降级兼容
最常被忽略的一点:很多人以为 composer init 后就能直接 require 'vendor/autoload.php',却忘了它根本不会生成这个文件——那得靠 composer install,而 install 能否成功,又全系于 composer.json 里那几行看似简单的字段是否经得起校验。


















