composer create-project必须指定包名和目录名,缺一即报错;包名须为packagist上type="project"的模板(如laravel/laravel),不可用库包;默认仅拉stable版本,需显式加--stability=dev等参数控制版本与镜像。

composer create-project 必须带包名和目录名
不填包名或目录名,命令直接失败,不是环境问题,是语法硬性要求。漏掉任一参数,就会看到 Not enough arguments (missing: "package") 或 Could not find package myapp 这类错误。
正确写法只有这一种模式:composer create-project vendor/name project-dir,例如:
-
composer create-project topthink/think myapp(ThinkPHP 官方推荐方式) composer create-project laravel/laravel blogcomposer create-project symfony/skeleton api
注意:vendor/name 必须是 Packagist 上 type="project" 的模板包,不能是 topthink/framework 这类库包——后者只能 require,不能 create-project。
拉不到最新代码?版本和稳定性要手动控制
默认只取 stable tag(比如 v8.0.5),不会自动拉 dev-main 或最新 commit。你以为的“最新”,可能落后几十个提交。
常见操作方式:
- 拉指定稳定分支:
composer create-project topthink/think myapp "8.*"(引号防 shell 展开*) - 拉开发分支:
composer create-project topthink/think myapp dev-main --stability=dev(漏--stability=dev会静默失败) - 查所有可用版本:
composer show topthink/think --all
不加 --stability=dev 却指定 dev-main,Composer 会跳过该分支、退而求其次选最近的 stable tag,过程无提示,容易误判。
卡住不动、vendor 为空?先盯镜像、缓存和路径
国内直连 packagist.org 极易超时,表现为命令无输出、CPU 占用低、等十分钟没反应。这不是 Composer 坏了,是网络不通。
排查顺序:
- 检查是否已设镜像:
composer config -g repo.packagist,应返回类似{"type":"composer","url":"https://mirrors.aliyun.com/composer/"} - 临时切镜像启动:
composer create-project --repository=https://mirrors.aliyun.com/composer/ topthink/think myapp - 清缓存再试:
composer clear-cache - 确认目标路径全英文、无空格、无中文,且当前用户有写权限(尤其
/var/www下非 root 执行易失败)
vendor 目录为空,90% 是安装中途失败但未报错,清缓存后重试基本解决。
post-create-project-cmd 脚本不执行?钩子位置和命名必须严格匹配
这个脚本只在新生成项目的 composer.json 根级 scripts 中定义才生效,不是模板包自己的 composer.json 里写的,更不是依赖包里的。
正确写法示例(位于新建项目根目录的 composer.json 中):
"scripts": {
"post-create-project-cmd": "php ./init.php"
}
关键点:
- 名称必须是
post-create-project-cmd,全小写,不能驼峰、不能漏短横 - 脚本执行时工作目录是新建项目根目录(如
myapp/),不是模板源码目录,所以路径别写../template/src这类相对引用 - 如果脚本含交互输入(如
readline()),在 CI 或加--no-interaction时会卡住,需提前判断
实际中很多人把钩子写在模板包的 composer.json 里,结果新建项目后完全不触发——这是最常被忽略的结构性错误。











