Composer 无自动框架功能,所谓“自动框架”实为标准化初始化流程、约定式目录结构与预置脚本的组合;核心命令是 composer create-project,用于下载骨架包并执行其初始化钩子。

Composer 本身不提供“自动框架”功能,所谓“自动框架”其实是通过标准化初始化流程 + 约定式目录结构 + 预置脚本组合实现的。关键不在 Composer 做了什么,而在于你用它做了什么。
composer create-project 是最接近“自动框架”的命令
它不是安装一个叫“框架”的东西,而是下载一个带完整骨架(skeleton)的包,并执行其预定义的初始化逻辑。
-
composer create-project topthink/think my-app:下载topthink/think这个 skeleton 包,它内部composer.json已声明依赖topthink/framework,并自带app/、config/、public/目录 -
composer create-project laravel/laravel my-app:同理,laravel/laravel是官方骨架,不是框架本体;真正的框架代码在vendor/laravel/framework - 执行时会自动运行
post-root-package-install和post-create-project-cmd钩子,比如生成.env、清空 Git 信息(默认删.git)、重命名配置文件 - 不要指望它适配所有场景——如果你要微服务或类库项目,用
create-project反而多此一举,直接composer init更干净
composer.json 的 type 字段决定项目性质
这个字段不控制代码行为,但影响 Packagist 发布、工具链识别和团队协作预期。
- 写
"type": "project":表示这是可运行的应用,比如博客、后台系统;composer install后应能直接跑起来 - 写
"type": "library":表示这是被其他项目require的类库;必须配好autoload和autoload-dev,且不应有public/或入口脚本 - 漏写
type不报错,但 CI 工具(如 PHPStan 扫描器)或私有仓库平台可能拒绝索引;composer validate会警告 - 别手写
"type": "framework"——Composer 官方不认可该值,也无任何特殊处理
autoload 配置错一个字符,类就加载失败
PSR-4 映射不是路径映射,是命名空间前缀到物理目录的**严格对应关系**,且对斜杠、大小写、相对位置极其敏感。
-
"App\": "src/"正确:AppControllerHome→src/Controller/Home.php;结尾双反斜杠\是必须的转义,写成"App"会解析失败 -
"src/"是相对于composer.json的路径,不能写成"./src/"或"src"(少末尾斜杠);也不能写成"/full/path/src/"(绝对路径不支持) - 改完
composer.json后必须运行composer dump-autoload,否则新规则不生效;加-o参数可生成优化版映射(生产环境推荐) - 如果类文件存在但报
Class not found,优先检查命名空间声明是否与 PSR-4 前缀完全一致(包括大小写),再确认文件名是否符合 PascalCase 规范
scripts 里放 post-autoload-dump 比 post-install-cmd 更安全
很多模板在 post-install-cmd 里执行清理、生成密钥等操作,但这个钩子会在任何 composer install 时触发——包括 CI 构建、Docker 构建、甚至队友本地 install,一旦出错整个流程中断。
- 把需要“每次 autoload 更新后执行”的逻辑(如生成代理类、刷新缓存、校验配置)放进
post-autoload-dump,它只在dump-autoload或install/update导致 autoload 变更时运行 - 所有脚本命令都建议加
--no-interaction,避免在非交互环境(如 CI)卡住 - 不要在 scripts 里写
rm -rf vendor或git checkout类操作——这些不属于 Composer 职责,且不可重现、难调试 - 用
composer run-script xxx手动触发脚本时,注意它不会自动执行前置钩子(如pre-xxx),需显式声明
真正难的不是写对几行 JSON,而是让所有成员理解:composer.json 是一份契约,不是配置文件;它的每个字段都在向工具链、CI、Packagist 和队友传递明确信号。格式、字段顺序、钩子时机、路径写法——这些细节没人盯着时,三天就能退化回“数组地狱”。



















