composer create-project 是初始化完整 Laravel 项目的正确方式,它克隆模板仓库、安装依赖、执行钩子并生成目录结构;而 composer init 仅创建空配置文件,composer require 仅添加包到 vendor,均无法替代。

直接用 composer create-project 初始化项目,别碰 composer init —— 后者只生成空 composer.json,不拉代码、不装依赖、不建目录结构,纯属白忙活。
为什么 create-project 不能被 require 替代
你执行 composer require laravel/laravel,结果只是把 Laravel 源码塞进 vendor/laravel/laravel/,app/、routes/、artisan 全都不在项目根目录;而 create-project 是先克隆整个模板仓库(比如 laravel/laravel 的 main 分支),再在目标目录里执行 composer install 和 post-create-project-cmd 钩子。
-
require是「往已有项目里加一个包」,适用场景:给当前项目装monolog/monolog或symfony/console -
create-project是「从头生成一个完整可运行项目」,适用场景:启动 Laravel、Symfony、Bedrock、Yii2-app-basic 等带骨架的模板 - 误用
require后发现php artisan serve报错或vendor/autoload.php找不到,大概率是因为入口文件没被正确生成或路径错位
create-project 必须指定的参数和常见踩坑点
默认行为容易翻车:不写版本会拉 dev-main(不稳定)、不写目录名会覆盖当前文件夹、不加 --remove-vcs 会导致新项目自带模板的 Git 历史。
- 指定稳定版本:
composer create-project laravel/laravel myapp "11.*"(双引号防 shell 解析) - 强制清空同名目录并跳过交互:
-n(即--no-interaction),否则遇到myapp已存在会卡住问你“是否删除” - 删掉模板自带的
.git目录:--remove-vcs,避免首次git push把上游提交历史一起推上去 - 调试失败时加
-vvv,能看到卡在哪一步——90% 是 Git clone 失败(如内网没配 SSH key)或私有仓库未配置auth.json
私有模板或自定义 skeleton 能不能用 create-project
能,但有两个硬性前提:包必须可被 Composer 访问(已配置 repositories),且其 composer.json 中必须声明 "type": "project"。否则即使包存在,create-project 也会报 Could not find package xxx。
- 私有 Git 仓库需提前在全局或项目级
composer.json中声明:"repositories": [{"type": "vcs", "url": "https://gitlab.example.com/myorg/my-skeleton"}] - 自己打包模板时,务必在
composer.json加这一行:"type": "project",这是 Composer 判断“这个包可被create-project拉取”的唯一依据 - 如果模板用了
post-create-project-cmd(如自动生成密钥、复制.env.example),这个钩子默认仍会执行,--no-interaction不会跳过它
执行完 create-project 却没有 vendor/autoload.php 怎么办
这不是命令失败,而是 composer install 步骤没跑完。常见于 CI 环境、Docker 构建或网络中断后自动退出。
- 先进入项目目录:
cd myapp - 手动补装依赖:
composer install --no-interaction - 确认 PHP 版本兼容:比如模板要求
"php": "^8.2",而你本地是 8.1,create-project会静默跳过安装,连vendor/目录都不会创建 - 检查是否误加了
--no-install(该参数极少用,仅用于调试,生产环境应避免)
最容易被忽略的是:模板包的 "type": "project" 字段和 PHP 版本约束,这两项不满足时,create-project 往往不报错,而是直接“假装成功”——目录建了,但里面只有空 composer.json 和 vendor/ 下零散文件,autoload.php 就是不存在。











