composer create-project 是初始化新项目而非克隆已有项目,它从 Packagist 下载指定包的完整骨架、解压并自动执行 install 和初始化脚本,不读取本地 composer.json 或 lock 文件;真要复刻现有环境,应使用 composer install。

composer create-project 不是用来“克隆”已有项目的命令,它本质是下载一个全新项目骨架并安装依赖——真要克隆环境,该用 composer install。
为什么 create-project 不是克隆,而是初始化新项目
它不读你当前目录的 composer.json 或 composer.lock,也不关心你本地有没有代码。执行 composer create-project laravel/laravel myapp 时,Composer 会:
- 从 Packagist 下载 laravel/laravel 包的指定版本(默认 latest stable)
- 解压整个项目结构(含 public/、routes/、预设 .env.example 等)
- 自动运行 composer install 和 post-root-package-install 脚本(如生成密钥)
- 删除模板自带的 .git 目录(除非加 --keep-vcs)
这和 git clone + composer install 完全不同:前者是“拿别人打包好的初始状态”,后者才是“复刻你自己的环境”。
常见错误:执行完没有 vendor/autoload.php
这不是命令失败,而是你用了 --no-install 或 --no-scripts 却没意识到后果:
- --no-install:只解压骨架,不装依赖 → vendor/ 为空,自然没有 autoload.php
- --no-scripts:跳过初始化脚本 → 可能没生成 .env 或密钥,但不影响 autoload 文件存在
- 目标目录非空 → 直接报错 Destination directory "xxx" is not empty.,根本走不到 install 阶段
- PHP 版本不匹配:比如 composer.lock 里声明 "php": ">=8.2",而你本地是 8.1 → 依赖安装中断,autoload.php 不生成
想真正克隆已有项目?必须用 install
如果你拿到的是一个别人的项目仓库(比如同事发来的 zip 或 git clone 下来的代码),还原依赖的唯一可靠方式是:
- 确保项目根目录下有未被修改的 composer.lock
- 运行 composer install(不是 create-project,也不是 update)
- 清空 vendor/ 目录(rm -rf vendor),避免混杂旧包
- 检查 php -v 和 composer show --platform 是否满足 lock 中的 platform 要求
composer update 是重建,不是克隆——它会忽略 lock,重新计算依赖树,导致版本漂移。
包名拼错或找不到?先确认三件事
报 Could not find package 时,90% 是以下情况之一:
- 包名写成 laravel/framework(这是组件,不是可创建的项目模板)→ 正确应为 laravel/laravel
- 没加 --stability=dev,但目标包最新版是 dev-main(如 Symfony 7.x、Laravel 11.x 的早期发布)
- 该包没声明 "type": "project" → composer show topthink/think | grep type 查一下,输出不含 project 就不能用 create-project
- 用了本地路径或 Git URL:composer create-project ./my-template 是非法的,create-project 只认 Packagist 或已配置的私有仓库中的合法包名
真正容易被忽略的点是:create-project 的行为完全由目标包的 composer.json 决定——它信任那个文件里的 autoload 配置、scripts 定义、platform 要求。你本地环境只要有一项不匹配,比如 PHP 小版本差一点、缺 ext-gd、甚至 umask 导致权限不对,都可能让 post-install 脚本静默失败,而你只看到 “成功”,却得不到可用的项目。











