create-project 命令本质是克隆已配置好的项目骨架:从 packagist 下载指定 vendor/name 的最新稳定版,解压并执行 composer install,清理临时文件;要求目标包声明 "type": "project",且需预先配置私有源或使用 -n、--remove-vcs 等参数实现自动化。

create-project 命令到底在做什么
它不是“新建空项目”,而是从指定包(通常是 vendor/name)下载最新稳定版,解压后执行 composer install,再删掉 vendor/composer/installed.json 等临时文件——本质是“克隆一个已配置好的项目骨架”。
- 如果你直接
composer init再手动写composer.json,那不属于模板场景 - 真正用
create-project的前提:目标包必须含composer.json且声明了"type": "project"(否则会警告但仍能跑) - 它不读取本地
composer.json,所有依赖都来自远程包的composer.json
为什么 vendor/name 不写全就报错
因为 create-project 默认只查 Packagist 官方源,且要求格式严格:vendor/name 必须存在、非私有、有稳定版本(如 v1.0.0 或 1.0),否则报 Could not find package vendor/name。
- 常见错误:把 GitHub 仓库地址当包名,比如输
https://github.com/foo/bar→ 应该用foo/bar(前提是已提交到 Packagist) - 私有包必须先在
composer.json里配好repositories,再加--repository-url参数 - 想强制用 dev 分支?得加
--stability=dev --prefer-source,否则即使包有dev-main也不会选
如何跳过交互式安装、全自动跑完
create-project 默认会问你是否删除已存在的目录、是否安装推荐插件等,CI/脚本里必须关掉这些交互。
- 加
-n(no-interaction)跳过所有提问 - 加
--remove-vcs自动删掉.git目录,避免后续 git 操作混乱 - 如果目标模板含
scripts(如post-create-project-cmd),它仍会执行;不想运行?加--no-scripts - 示例命令:
composer create-project laravel/laravel myapp -n --remove-vcs
模板里的 autoload 和路径映射怎么生效
模板自身的 autoload 配置(如 "psr-4": {"App\": "app/"})会在 create-project 后立刻写入新项目的 vendor/autoload.php,但仅对模板自带代码有效。
- 你后续在新项目里新增的类,必须自己改
composer.json的 autoload 段并运行composer dump-autoload - 如果模板用了
classmap映射了database/,而你删了这个目录,autoload_classmap.php里还留着旧路径——不会报错,但类加载会失败 - 别依赖模板自动帮你处理
config/或resources/下的文件;它们只是复制过去,内容不会因环境变量或交互输入动态替换
最常被忽略的是:create-project 不做任何代码生成或变量替换。所谓“模板”只是静态文件快照,没有类似 Cookiecutter 或 Yeoman 的占位符渲染能力。要动态注入值,得靠模板自身定义的 scripts 或额外工具配合。










