composer create-project 是唯一靠谱的新项目起点,它基于 type: "project" 的模板包(如 laravel/laravel)完整复制骨架、自动安装依赖并执行初始化脚本,产出含 vendor/autoload.php 的可运行项目,而非空壳或仅装库。

composer create-project 不是“下载一个包”,而是基于一个 type: "project" 的 Composer 包,完整复制其文件结构、预置配置和依赖定义,并自动执行 composer install。它直接产出可运行的项目目录,不是空壳。
为什么 laravel/laravel 和 symfony/skeleton 能被直接用作模板?
这些包在 composer.json 中声明了 "type": "project",且包含完整的应用骨架(app/、config/、public/、.env.example 等),不是纯库。Composer 识别到该类型后,会跳过常规依赖注入逻辑,转而解压整个包内容到新目录。
- 不带
"type": "project"的包(比如monolog/monolog)无法用于create-project - 私有模板只要满足该 type + 含有效
composer.json+ 可访问,就能复用同一命令 - 部分模板还定义了
post-create-project-cmd脚本,如自动生成.env或APP_KEY,这些只在create-project阶段触发
create-project 执行失败但没报具体错误?先查这三处
常见静默失败或卡住,往往不是命令本身问题,而是环境或参数隐性冲突:
-
Could not find package:国内镜像源未同步新版(如 Laravel 11 已发布但阿里云源延迟),临时切回官方源:composer config -g repo.packagist composer https://packagist.org - 目标目录已存在且非空:命令默认拒绝覆盖,加
--remove-vcs或手动清空目录 - 执行完没有
vendor/autoload.php:说明composer install步骤被跳过,典型原因是用了--no-install,或非交互式环境(CI/Docker)中权限不足导致 install 中断;补救只需进目录跑composer install --no-interaction
指定版本时,约束写法错一个字符就拉不到
Laravel 11 和 Symfony 7 都要求严格语义化版本约束,11、11.0、11.x 全部无效,必须写成:
composer create-project laravel/laravel:^11.0 myappcomposer create-project symfony/skeleton:^7.0 myapi- 想用开发分支?写
dev-main或dev-7.x,不能省略dev-前缀 - 省略版本号时,Composer 会取 latest stable,但若你本地
minimum-stability设为dev,可能意外拉到 unstable 版本
.env 是从 .env.example 复制来的,但 APP_KEY 并未自动填充(除非模板显式调用了 php artisan key:generate)。不手动运行这一步,后续所有加密、session、CSRF 都会失效——这不是安装问题,是初始化遗漏。


















