create-project 是另起炉灶创建完整项目骨架,而非在当前项目中安装依赖;它忽略本地配置,清空目标目录后解压模板并执行 install。

create-project 不是 “带安装的 require”
很多人以为 composer create-project 就是 composer require 加了个自动装依赖的开关,其实它干的是完全不同的事:它不往你当前项目里加东西,而是从头拉一个**完整项目骨架**(含 composer.json、index.php、目录结构、钩子脚本等),再进那个新目录执行一次 composer install。
这意味着:
- 你在已有项目的根目录下运行
composer create-project laravel/laravel myapp,它会新建myapp/目录,并把你的当前composer.json完全无视——哪怕你刚写了一半,也毫无影响 - 它不会读取你本地的
repositories配置或config设置,所有行为都基于目标包自身的composer.json - 如果目标包 type 不是
"project"(比如只是个库monolog/monolog),命令会直接报错:Could not find package monolog/monolog with stability stable.
require 是“往现有项目里塞依赖”,create-project 是“另起炉灶”
composer require 的本质是修改当前项目的 composer.json(追加到 require 或 require-dev),然后装包;而 create-project 会清空你指定的目标目录(如果非空且未加 --keep-vcs),再把整个包解压进去,最后跑一遍 install。
典型误用场景:
- 想给自己的 Laravel 项目加个新组件,却敲了
composer create-project spatie/laravel-permission→ 报错或新建一堆无用文件夹 - 在公司私有 GitLab 上搭好了一个内部脚手架
acme/internal-skeleton,但没在composer.json里声明"type": "project"→create-project死活拉不下来 - 用
composer create-project laravel/laravel .想覆盖当前目录 → 如果当前目录非空(哪怕只有.git),命令直接失败,不提示、不覆盖、不询问
常见参数组合怎么选才不踩坑
参数不是越多越好,关键是匹配使用意图。下面几个组合覆盖 90% 场景:
-
composer create-project laravel/laravel blog --prefer-dist --no-dev:适合上线前快速搭个生产环境,跳过测试工具,走压缩包加速 -
composer create-project symfony/skeleton api --prefer-source --keep-vcs:想看框架源码、顺手提 PR?用--prefer-source克隆 Git 仓库,并保留.git方便提交 -
composer create-project topthink/think thinkphp5 --stability=stable:有些包默认只发dev版,不加--stability可能装到不稳定快照,加了才确保拿到 tagged 版本 -
composer create-project drupal/recommended-project mysite --no-install:Drupal 8+ 推荐方式,先拉骨架,再手动改composer.json加模块,最后composer install
为什么 create-project 有时卡住或报错找不到包
错误往往不是命令本身的问题,而是包元数据或网络策略导致的:
- 报
Could not find package xxx:先确认包名拼写(注意斜杠方向)、是否在 packagist.org 可搜到;私有包必须提前用composer config repositories.xxx vcs url注册 - 下载慢或超时:默认走
--prefer-dist,但国内没镜像时,可加-vvv看实际请求地址,再配阿里云或腾讯云 Composer 镜像源 - 装完发现
APP_KEY没生成、storage权限不对:那是 post-create-project-cmd 脚本没执行成功,检查该包是否定义了这个钩子,以及你系统是否禁用了 shell 执行
最常被忽略的一点:create-project 创建的项目,它的 autoload 规则、PSR-4 映射、脚本钩子全部来自模板包自身,和你的本地 Composer 全局配置无关——别指望它自动继承你习惯的 autoloader 设置。











