“project directory is not empty”是composer对非空目录的硬性拒绝错误,因create-project语义为“从零克隆骨架”,禁止覆盖任何文件(含.git、.env.example等),无--force参数可绕过,唯一可靠解法是手动清空目录或换新空目录安装。

“Project directory is not empty” 是硬性拒绝,不是警告
这个错误出现在你运行 composer create-project 时目标目录里**有任何文件或子目录**(包括 .git、.env.example、.vscode/、甚至空的 README.md),Composer 就会直接中止,不执行任何下载或解压。它不是权限问题,也不是网络问题,而是设计上禁止覆盖——因为 create-project 的语义是“从零克隆骨架”,不是“更新已有项目”。
没有 --force 参数能绕过,删目录是唯一可靠方式
以下参数常被误用,但它们完全不影响“目录是否为空”的判断:
-
--no-interaction:只关闭交互提示,不跳过空目录检查 -
--remove-vcs:只在下载后删掉模板包自带的.git,不帮你清空当前目录 -
--force:Composer 官方**根本不存在这个参数**
真正有效的做法只有两个:
- 手动清空目标目录:
rm -rf myapp && mkdir myapp(Linux/macOS)或del /q myapp\* && rd /s /q myapp\.git && mkdir myapp(Windows),再运行composer create-project laravel/laravel myapp - 换一个全新空目录安装,比如
composer create-project laravel/laravel ./fresh-app,装完再把必要配置(如.env、config/下定制项)手动合并过去
别用 composer init 替代 create-project
composer init 只生成 composer.json,它不会拉取框架文件、不建 app/ 或 routes/ 目录、不放 artisan 脚本,更不会触发 post-create-project-cmd 钩子。结果就是你得到一个空壳,运行 php artisan 会直接报 Class not found。
如果你已有代码想初始化依赖,应该用:
-
composer install(已有composer.lock) -
composer update(要重算依赖树) - 而不是
create-project
容易被忽略的关键点:.git 也算“非空”
很多人反复失败,是因为删了普通文件却忘了 .git 目录。哪怕它是空仓库(git init 后没提交任何东西),Composer 仍判定目录非空。IDE 自动生成的隐藏目录(如 .idea/、.vscode/)同理。每次重试前,务必确认 ls -la myapp(或 dir /a myapp)输出为空——或者干脆用 rm -rf myapp 彻底删除再新建。











