必须将包设为"type": "project",根目录含composer.json和可运行入口;默认只搜stable版,需加--stability=dev或打tag;post-create-project-cmd须定义在模板根composer.json中执行占位符替换等操作。

composer create-project 没有“默认渲染模式”这个概念——它不渲染任何东西,只做一件事:把目标包的代码(含 composer.json)完整复制到新目录,并执行 install。所谓“模板设置”,本质是让 Composer 把你的包当成一个可直接运行的项目骨架来用,而不是装进 vendor/ 里的普通依赖。
为什么 create-project 不认你的模板?
最常见原因就一个:"type": "project" 缺失或写错位置。
-
composer.json顶层必须有"type": "project",不能放在extra或缩进错层 - 设成
"type": "library"或干脆不写 type,Composer 就会把它当普通包处理,create-project会失败或静默降级为require到vendor/ - 包没打 tag 且没加
--stability=dev,也会报 “Could not find package”——因为默认只搜stable版本
post-create-project-cmd 脚本怎么写才生效?
这个钩子必须定义在**模板包自己的 composer.json 根目录下**,不是你本地项目的。
- 示例配置:
"scripts": { "post-create-project-cmd": [ "sed -i 's/your-vendor-name/my-company/g' app/config/app.php", "rm -f .git" ] } - 脚本在新项目目录里执行,路径上下文是目标项目根目录,不是模板源码目录
- Windows 下
sed不可用,得改用 PowerShell 命令或 PHP 脚本;跨平台建议用php -r "file_put_contents(...)" - 不要依赖交互式命令(如
read),create-project --no-interaction是默认行为,脚本必须全自动
模板里怎么替换占位符(比如 vendor/name)?
别手动改,也别指望 Composer 自动填——它不会读你注释里的 @@VENDOR@@。
- 用
post-create-project-cmd调用 PHP 脚本批量替换,例如:"php -r \"file_put_contents('composer.json', str_replace('your-vendor/your-package', 'my-team/my-app', file_get_contents('composer.json')));\"" - 确保模板中所有占位字符串唯一且带明显前缀(如
__VENDOR_NAME__),避免误替换 - 替换完记得
composer dump-autoload或composer install(如果脚本里没自动触发) - 注意 Windows 换行符(CRLF)可能让正则替换失败,统一用 LF 提交 Git
autoload 配置和入口文件结构,必须能让新项目跑起来。哪怕只是 php -S localhost:8000 -t public/ 能访问首页,否则用户 clone 完第一反应就是“这模板坏了”。create-project 不验证可运行性,只管复制——能不能用,全靠你模板自己兜底。


















