composer init 只生成 composer.json 文件,内容为交互填写的元信息,不创建 vendor/ 目录、不安装包、不配置 autoload。

composer init 会生成什么文件
执行 composer init 后,它只生成一个 composer.json,内容是交互式填写的元信息(name、description、require 等),**不会创建 vendor/、不安装任何包、也不写 autoload 配置**。很多人以为“初始化=能用了”,结果下一步 composer install 报错,就是因为没填对 autoload 或依赖版本写得太死。
常见错误现象:Class not found 却查不到 autoload 配置;或 composer install 提示 no matching package found,其实是 require 里写了不存在的包名或版本号。
- 交互中填
name必须是vendor/name格式(如myorg/myapp),否则后续发布到 Packagist 会失败 - 如果只是本地脚本或 CLI 工具,
type建议选project(默认),别选library——后者会触发 Packagist 兼容检查,徒增干扰 -
autoload不填就留空,但之后必须手动加,否则 PSR-4 自动加载不生效;推荐用"autoload": {"psr-4": {"App\": "src/"}}
不交互、直接生成最小 composer.json
想跳过问答流程?用 composer init --name=myorg/myapp --description="My CLI tool" --require="php:^8.1" --no-interaction。它生成的 composer.json 是合法且可立即 install 的,但注意:
-
--require只接受vendor/package:version形式,不能写php >=8.1,得用php:^8.1 - 它不会自动加
autoload,哪怕你指定了--autoload-psr4,这个参数在新版 Composer 中已被移除,必须手写 - 生成后建议立刻运行
composer validate,检查 JSON 结构和字段合法性(比如name缺少 vendor 段会报错)
为什么 composer create-project 不适合“初始化”
composer create-project 是用来克隆已有项目模板(如 laravel/laravel)的,不是初始化空白项目。新手常误用 composer create-project --prefer-dist composer/composer 想“装个空壳”,结果拉下来的是 Composer 自身源码,还带一堆 dev 依赖和测试文件。
真正该用的场景只有两个:
- 你想基于某个框架启动(如
composer create-project laravel/laravel myapp) - 你维护了一个私有模板库,并已配置好
composer.json+autoload+ 目录结构
除此之外,create-project 会强制执行 install、写 lock 文件、甚至运行 post-create-project-cmd 脚本——这些对纯初始化毫无必要,反而掩盖了依赖解析的真实过程。
vendor/autoload.php 怎么被正确引入
生成 composer.json 并跑完 composer install 后,vendor/autoload.php 才存在。但它不会自动生效,你得在代码里显式 require 它:
require __DIR__ . '/vendor/autoload.php';
容易踩的坑:
- 路径写错:用
__DIR__而不是dirname(__FILE__)(两者等价但前者更惯用);别硬写相对路径如../vendor/autoload.php,一旦入口文件位置变就崩 - 没确认
autoload配置是否匹配实际目录:比如"App\": "src/",但你的类文件放在lib/下,那就永远找不到 - CLI 脚本里忘了这行,直接 new 一个类就报
Class not found,而 IDE 可能因为索引还在提示“没问题”
复杂点在于:如果你改过 composer.json 里的 autoload,必须运行 composer dump-autoload 才能让新映射生效,install 或 update 不一定触发它。










