composer create-project是唯一靠谱的新项目起点,它从"type": "project"的模板包(如laravel/laravel)拉取完整可运行骨架,自动安装依赖、生成vendor/autoload.php并执行初始化脚本;而composer init仅生成空composer.json,无法构建可直接运行的项目结构。

直接用 composer create-project,别碰 composer init——后者只生成空 composer.json,而你要的是能立刻 php artisan serve 或 php -S 跑起来的完整结构。
为什么 create-project 是唯一靠谱的新项目起点
它不是“装个包”,而是从一个已声明 "type": "project" 的包(比如 laravel/laravel、symfony/skeleton)里,把整个可运行骨架(含 public/、artisan、.env.example、预设 autoload 规则)一次性拉下来,自动执行 composer install,并运行其 post-create-project-cmd 脚本(如生成密钥、复制环境文件)。
你手动 init + require laravel/framework 得到的只是一个库在 vendor/ 里,没有 routes/、没有 app/ 目录、也没有 autoload.php 可被 Web 服务器加载——结构天然错误。
-
create-project的目标是产出一个根目录下就有vendor/autoload.php的项目 - 它不读取当前目录的任何文件,哪怕你在已有项目的根目录下运行,也会无视并新建目录
- 模板包必须带
"type": "project",否则命令静默失败或报Could not find package
包名写错、版本拉不到?先查这三个硬条件
报 Could not find package,90% 不是网络问题,而是下面任一条件不满足:
- 包名拼错:写成
laravel/framework(这是库)而非laravel/laravel(这是项目模板) - 没加稳定性约束:模板只有
dev-main分支,但你的全局minimum-stability是stable→ 加--stability=dev - 私有包未配置源:Git 仓库地址没在
composer.json的repositories里声明为"type": "vcs"
验证是否支持 create-project:打开 Packagist 页面,看该包的 type 字段是不是 project;或者直接跑 composer show vendor/name,确认输出里有 type : project。
目录已存在、脚本卡住、Git 冲突?这些参数几乎每次都要加
默认行为对实际开发极不友好,不加参数容易卡死或污染新项目:
-
--no-interaction(简写-n):跳过所有提示,尤其避免 SSH 密码输入、Do you want to remove the existing VCS?这类交互阻塞 CI 和本地脚本 -
--remove-vcs:删掉模板自带的.git目录,防止你后续git init报错或误提交历史 -
--no-scripts:调试模板时禁用post-create-project-cmd,避免自动生成错误.env或密钥 -
--prefer-dist:强制走 zip 包下载,比--prefer-source(克隆 Git)快且干净,默认已启用,但显式写出更可控
典型安全组合:composer create-project laravel/laravel blog --stability=dev --remove-vcs --no-interaction。
目标目录非空、PHP 版本不匹配、vendor 没生成?检查基础前提
命令执行完发现没 vendor/、报 PHP 版本错误、或提示目录已存在——这些不是 bug,是明确的前置条件未满足:
- 目标目录必须为空或不存在:如果
myapp/已存在且含任意文件,命令直接退出,不会覆盖 - PHP 版本需匹配模板要求:Laravel 11 要求 PHP 8.2+,若你本地是 8.1,会报
Your requirements could not be resolved,而不是版本拉不到 -
--no-install会导致无vendor/和autoload.php:这个选项极少用,除非你明确要手动控制依赖安装时机 - Windows 下路径含中文或空格:可能触发 Composer 内部路径解析异常,一律用英文纯字母目录名
最常被忽略的一点:create-project 生成的项目,其 composer.json 里的 autoload 配置是模板定义的,不是你当前环境推导的——所以别指望它能自动适配你本地的命名空间习惯,改结构前先看清楚模板怎么写的。


















