composer create-project 用于克隆预设结构的模板仓库(如 laravel、symfony starter),而非单纯安装依赖;它拉取源码+依赖,而 install 只装 vendor/;需注意模板 type、权限、代理、require-dev 及 php 环境要求。

composer create-project 能直接生成演示项目,但要注意模板类型
Composer 本身不提供“演示项目”这个概念,它只负责按 composer.json 安装依赖和执行脚本。所谓“拉取样本代码”,实际是用 create-project 命令克隆一个已预设好结构的仓库(比如 Laravel、Symfony 的官方 starter 模板)。
常见错误是以为 composer install 就能跑起示例——其实它只装 vendor/,没代码文件;必须用 create-project 才会把源码+依赖一起拉下来。
- 命令格式:
composer create-project vendor/name project-dir --stability=stable - 例如拉 Laravel 示例:
composer create-project laravel/laravel demo-app - 如果目标包没声明
type: project,create-project可能失败或只装空壳 -
--no-install参数可跳过依赖安装,适合离线环境或想手动改composer.json后再装
拉下来的代码里没有 index.php?检查是否用了 skeleton 模板
有些官方模板(如 symfony/skeleton)故意不带 Web 入口,只保留最小结构,靠命令行驱动。这不是 bug,是设计选择。
典型现象:运行 php -S localhost:8000 报错“File not found”,ls 看不到 public/ 或 index.php。
- symfony/skeleton 默认无 Web 层,需额外执行:
composer require webapp - laravel/laravel 模板自带
public/index.php,但要求APP_KEY已生成(php artisan key:generate) - 若用
--prefer-dist下载,可能因压缩包不含 git hooks 或 dev 文件,导致某些初始化脚本缺失
权限或路径问题让 composer create-project 卡住或报错
错误信息常是 Could not delete ... 或 file_put_contents(...): failed to open stream,本质是当前用户没写权限,或防病毒软件锁了临时目录。
不是 Composer 不行,是它在解压时需要往系统临时目录(如 /tmp 或 C:\Users\XXX\AppData\Local\Temp)写文件。
- Linux/macOS 下检查:
ls -ld $(mktemp -d),确认当前用户有读写权限 - Windows 用户遇到
Access is denied,试试以管理员身份运行终端(仅限必要时) - 用
COMPOSER_CACHE_DIR环境变量指定缓存路径,避开受限目录:COMPOSER_CACHE_DIR=/home/user/composer-cache composer create-project ... - 公司网络下若卡在 “Downloading ...” 阶段,大概率是 HTTPS 代理拦截了 zip 包流,需配
http-proxy或换国内镜像源
composer.json 里 require-dev 的包不会自动启用,但 demo 项目常依赖它们
很多范例项目把测试、本地服务器、调试工具放在 require-dev,比如 phpunit/phpunit、symfony/cli、laravel/pint。不手动装,phpunit 命令就找不到。
现象:执行 ./vendor/bin/phpunit 提示 “No such file or directory”,但 composer show 显示已列在 require-dev 里。
- 默认
create-project会装require-dev,除非加了--no-dev参数 - 如果误加了
--no-dev,补救命令是:composer install --dev - 某些模板(如 Symfony Flex)会在
post-create-project-cmd脚本里自动删掉require-dev,要看composer.json的scripts字段
真正容易被忽略的是:不同模板对 PHP 版本、扩展(如 mbstring、xml)的隐式要求,往往不写在文档第一行,而藏在某个 composer.json 的 config.platform.php 或 CI 配置里。跑不起来之前,先看 php -v 和 php -m。










