composer init仅生成基础composer.json,不检测composer 2.x新特性、不自动补type/installedversions等字段,行为与版本无关;必须手动补全type、psr-4 autoload、运行validate --strict,并重生成lock文件。

composer init 不检测、不支持、也不生成任何 Composer 2.x 新特性相关配置——它连 composer.json 里该不该加 type 字段都懒得管,更不会自动启用 InstalledVersions 或校验字段顺序是否符合 v2.5+ 的 composer format 要求。
composer init 根本不关心你用的是 Composer 2.x 还是 1.x
它只做一件事:把你在终端里敲的几行输入,原样塞进 JSON 键值对。无论你装的是 2.9.6 还是 1.10.22,composer init 行为完全一致。它不会:
- 检查是否支持
composer format(哪怕你用的是 2.5.0+) - 提示你该用
InstalledVersions::class替代手动读composer.lock - 在生成时自动补
"type": "project"或"autoload"字段 - 验证你填的 license 是否符合 SPDX 标准(那是
composer validate --strict干的事)
想用 Composer 2.x 新特性?init 后必须手动补三件事
交互式 composer init 生成的文件,默认是“能过 basic validate”的最低可用配置,离安全、可发布、可维护差很远。真正要用上 2.x 的能力,得立刻补:
-
composer validate --strict --no-check-publish—— 立刻跑,否则拼错autoload写成autoloader都发现不了 - 手动加
"type": "project"或"library":没这个字段,Packagist 拒绝收录,CI 里某些插件也会跳过处理 - 确认
"autoload"是 PSR-4 且路径末尾带/,比如{"App\": "src/"};少一个反斜杠或斜杠,class_exists('AppFoo')就返回false
composer init --no-interaction 下最容易漏掉的两个参数
非交互模式下,--no-interaction 不是“省事”,是“零容错”。缺一个必需参数,命令直接退出,不生成任何文件。最常卡住的两个点是:
-
--name必须含/,写成myapp报错Invalid package name;得写成myorg/myapp -
--author必须是Name <email></email>格式,不能只写John Doe;否则composer validate --strict会报 author 格式非法 - 如果用
--autoload,注意 shell 中反斜杠要双写:--autoload='{"psr-4":{"App\\":"src/"}}'
别指望 init 后直接 run composer install
执行完 composer init,composer install 十有八九报 No lock file found。这不是 bug,是设计:init 不运行 update,也不生成 composer.lock。你得自己决定是:
- 先
composer install(会自动生成 lock,但依赖版本可能不是你想要的) - 还是先
composer update(强制解析全部依赖,生成精确 lock,适合新项目起步) - 或者直接
composer require vendor/pkg(更可控,且会自动更新 lock)
另外,如果你正在从 Composer 1.x 升级到 2.9.6,记得删掉旧的 composer.lock 和整个 vendor/ 目录再重装——v2 的锁文件格式已变,复用旧 lock 必然失败。











