create-project是唯一能真正安装模板的命令,它克隆完整仓库、执行install和钩子、生成开箱即用项目;init只建空配置,require仅装包到vendor,均无法构建骨架。

create-project 是唯一能真正“安装模板”的命令
别用 composer init 或 composer require 试图初始化项目骨架——它们根本做不到。前者只生成空 composer.json,后者只是把源码塞进 vendor/,app/、routes/、artisan 全都不在根目录,php artisan serve 必然报错。
create-project 才是正解:它先克隆整个模板仓库(比如 laravel/laravel 的 11.* 分支),再在目标目录执行 composer install 和 post-create-project-cmd 钩子,最终给你一个开箱即用的完整项目。
- 误用
require后发现vendor/autoload.php找不到?大概率是因为入口文件压根没被复制出来 - 想启动 Laravel/Symfony/Yii2-app-basic/Bedrock?必须用
create-project - 私有模板或自定义 skeleton 能不能用?可以,但前提是包的
composer.json中声明了"type": "project",否则会报Could not find package xxx
不加版本号默认拉 dev-main,90% 的翻车从这里开始
不写版本约束,create-project 默认拉取 dev-main 或 dev-master,而这些分支往往不稳定、未测试、甚至缺少关键脚本。Laravel 11 的 dev-main 可能还没发布正式版,你跑起来连 .env.example 都没有。
- 指定稳定版本:
composer create-project laravel/laravel myapp "11.*"(双引号防 shell 解析) - 拉特定 tag:
composer create-project symfony/skeleton myapi v6.4.0 - 用分支名要带
dev-前缀:composer create-project yiisoft/yii2-app-basic myyii dev-develop - 不加引号在 zsh/bash 下可能被提前解析,尤其含
^或*时
目录已存在、Git 历史残留、依赖没装完,三个高频卡点
命令卡住、报错、生成项目却无法运行,通常就这三类问题:
-
目录已存在:默认会交互询问是否删除,CI 或脚本里直接挂住。加
-n(即--no-interaction)强制覆盖 -
残留 .git 目录:模板自带的 Git 历史会被一起复制进来,首次
git push可能把上游提交全推上去。加--remove-vcs自动删掉.git -
vendor/autoload.php 缺失:不是命令失败,而是
composer install步骤中途退出(常见于网络中断、CI 环境无缓存、Docker 构建超时)。进入项目目录后手动补跑:composer install
调试失败就加 -vvv,别猜
命令静默失败?加 -vvv 看真实日志,90% 的问题定位在前两行:
-
Cloning into 'myapp'...卡住 → Git clone 失败(内网没配 SSH key / HTTPS 认证过期 / 私有仓库没配auth.json) -
Loading composer repositories...卡住 → Packagist 访问超时(换国内镜像:composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/) -
Executing command (CWD): git ...报错 → 模板包的composer.json里写了不可达的私有 repo,或post-create-project-cmd脚本里调用了不存在的命令(比如artisan但没先chmod +x artisan)
真正麻烦的不是命令本身,而是模板作者写的 post-create-project-cmd 脚本——它不校验环境、不提示缺失 CLI 工具、也不处理权限,出错就静默失败。这点最容易被忽略。











