composer create-project 用于基于已发布Composer包初始化项目,而非创建模板;它只识别Packagist或私有仓库中的合法包名,不支持本地路径或Git URL。

composer create-project 不是用来“创建项目模板”的命令,它本质是从已有包(通常是某个框架或脚手架)拉取一份可立即运行的项目副本。你无法用它“定义模板”或“生成模板文件”,只能基于已发布的 Composer 包初始化项目。
为什么 create-project 总是报错“Could not find package”?
这是最常见误用:把本地目录、Git 仓库地址甚至 ZIP 链接直接丢给 create-project,但它只认 **已注册在 Packagist 或自建 Composer 仓库中的合法包名**(格式如 laravel/laravel、symfony/skeleton)。
- 错误示例:
composer create-project ./my-template—— 路径不被支持 - 错误示例:
composer create-project https://github.com/user/repo.git—— URL 不是包名 - 正确前提:目标仓库必须有
composer.json,且已发布到 Packagist 或配置了私有仓库源 - 若想用私有 Git 仓库,需先在
composer.json中声明repositories,再用包名调用(如vendor/project-name)
create-project 的核心参数怎么选?
它不是无脑执行,几个关键参数直接影响结果:
-
--stability(简写-s):控制是否允许安装dev或alpha版本。默认只装stable,但像symfony/skeleton的最新版常标为dev-main,不加-s dev就会找不到 -
--no-install:跳过composer install,适合后续手动干预依赖(比如换 PHP 版本后再装) -
--no-scripts:跳过post-root-package-install等钩子脚本,避免自动执行php artisan key:generate这类操作 -
--prefer-dist(默认) vs--prefer-source:前者下 ZIP 包快,后者克隆 Git 仓库,便于后续改源码
composer create-project laravel/laravel my-app --stability=dev --no-scripts
如何让自己的项目“能被别人用 create-project 初始化”?
这需要你主动适配 Composer 生态,不是改个命令就行:
- 项目根目录必须有合规的
composer.json,其中"type"推荐设为"project"(非必需但语义清晰) -
"name"字段必须是vendor/name格式,且未被占用;若发到 Packagist,需通过 GitHub/GitLab 绑定自动同步 - 如果含安装后逻辑(如生成密钥、初始化 DB),要写进
"scripts"的"post-root-package-install",否则用户执行完命令还得手动跑一堆步骤 - 注意
"autoload"配置:框架类通常不需要自动加载,但如果你的模板带工具类,得显式声明 PSR-4 映射,否则vendor/autoload.php不会包含它们
替代方案比硬套 create-project 更实际
真要“创建模板”,尤其是带交互、多选项、本地文件渲染的场景,create-project 天然不胜任:
- 用
git clone+sed/envsubst批量替换占位符,更可控 - 用专用工具如
cookiecutter(Python)或yeoman(JS),支持提问式生成、条件模板、钩子脚本 - GitHub Template Repositories:勾选 “Template repository”,用户点 “Use this template” 即可复制,无需 Composer 参与
- 如果坚持走 Composer 生态,可封装一个轻量 CLI 工具(如用
symfony/console),把create-project当底层动作之一,再叠加路径清理、配置注入等步骤
真正卡住人的,从来不是命令怎么打,而是没分清「分发一个开箱即用的项目」和「提供一个可复用的模板引擎」这两件事的本质区别。










