composer init 仅交互式生成 composer.json,不初始化项目;Package name 必须为全小写 vendor/name 格式;autoload 不默认配置 PSR-4,需手动添加双反斜杠命名空间与真实存在的 src/ 路径;require 填语义化约束(如 ^7.8)而非具体版本;--no-interaction 不提供默认值,缺字段即失败;生成后须立即运行 composer validate 并手动创建对应目录结构。

composer init 不是“初始化项目”,它只是交互式生成 composer.json 的填空向导;填错任意一项,后续 autoload 失效、CI 构建失败、class not found 都会立刻出现。
Package name 必须是 vendor/name 格式
它不会自动推导合法包名,一旦当前目录名含空格、大写字母或特殊符号(如 My App、project_v2!),就会卡住或报 Invalid package name。这不是 bug,是强制校验。
- 填
myapp或app→ 直接失败,缺/段 - 填
MyApp/MyProject→ 失败,vendor 和 name 都必须全小写 - 正确写法只有:
myorg/myproject、local/cli-tool - 已卡住?按
Ctrl+C中断,改用composer init --name="myorg/myproject"跳过
autoload 不会默认配置 PSR-4
交互流程里那个 “Do you want to define your autoload settings?” 提示极具误导性——选 yes 只能配 classmap,不支持 psr-4;而绝大多数现代 PHP 项目依赖的是命名空间自动加载。
- 不手动加
"autoload": {"psr-4": {"App\": "src/"}}→require 'vendor/autoload.php'后new AppExample()必然报错 -
"App"必须是双反斜杠,写成"App"或"App\"(单引号内)都会失效 - 路径
"src/"必须真实存在,且相对于composer.json所在目录;./src/、lib/(没同步改命名空间)都不行 - 改完必须立即运行
composer dump-autoload,install或update不会自动触发
require 填的是约束表达式,不是版本号
当提示 “Which version constraint to require for guzzlehttp/guzzle?”,你填的不是 7.8.1,而是语义化约束规则。填错会导致 composer install 找不到包、装错版本、甚至死锁。
- 填
main或master→Could not find package,Composer 不识别分支别名 - 填
7.8.1(无符号)→ 锁死该版本,后续update不升级,维护成本飙升 - 填
*→ 允许任意版本,极易引发破坏性更新或兼容性冲突 - 推荐填法:
^7.8(允许 7.x 兼容更新)、dev-main(仅限本地调试,且需确保"minimum-stability": "dev")
--no-interaction 不是“跳过思考”,是跳过提问但要求字段齐全
这个参数常被误用为“一键初始化”,但它根本不提供默认值——缺任何一个必需字段(比如没传 --name 或 --require),命令直接退出并报错,不会帮你补、也不会给提示。
-
composer init --name="myorg/myproject" --no-interaction→ 合法,生成最小可用 JSON -
composer init --name="myorg/myproject" --require="php:^8.1" --autoload="psr-4:App\:src/" --no-interaction→ 注意\和末尾/,格式错一个就写不进 autoload -
--require="guzzlehttp/guzzle"(漏版本)→ 报Could not parse version constraint - 生成后务必立刻跑
composer validate,它能秒级发现全角引号、BOM、name缺 vendor 段等硬伤
最易被忽略的一点:composer init 从不创建 src/ 目录、不写任何 PHP 文件、不生成 vendor/、也不执行任何脚本。它只输出 JSON——这意味着你填的所有路径、命名空间、PHP 版本约束,都必须和你接下来手动创建的文件结构、运行环境完全对齐,差一点,Class not found 就在下一秒等着你。











