create-project 命令不支持导出参数为模板;所谓“导出”实为误解,需先构建含"type":"project"的可复用包,并通过脚本(如shell/Makefile)固化常用参数,版本号必须加引号防shell展开。

create-project 命令本身不支持导出参数为模板
Composer 没有 composer create-project --export-template 或类似功能。所谓“把命令参数导出成模板”,本质是反向操作:你得先有一个可复用的项目包(即模板),再用 create-project 去消费它。命令参数只是调用入口,不是模板载体。
常见误解是以为执行一次 composer create-project laravel/laravel my-app "11.*" 后,就能一键提取出“这个命令对应的模板定义”。但实际它只是下载、解压、安装,并不记录或生成可复用的模板元数据。
想复用命令?直接保存 shell 脚本或 Makefile
最轻量、最可靠的方式是把常用参数固化为可执行文本:
- 写个
./init-laravel.sh,内容为:#!/bin/bash composer create-project laravel/laravel "$1" "$2" --no-interaction --remove-vcs
,调用时./init-laravel.sh my-project "11.*" - 在
Makefile里定义:laravel: composer create-project laravel/laravel $(APP_NAME) "$(VERSION)" --no-interaction
,然后make laravel APP_NAME=my-app VERSION="11.*" - Windows 用户可用
init.bat,注意version参数必须加双引号,否则11.*会被 CMD 展开为文件名匹配
真正要“导出模板”,得从项目包源头做起
如果你有一套自建项目结构(比如带预设 CI 配置、Dockerfile、PSR-4 自动加载的 PHP 库骨架),想把它变成别人能 create-project 的模板,必须满足三个硬性条件:
-
composer.json中必须声明"type": "project"(不是library或metapackage) - 仓库需公开(或配置好私有 Packagist 镜像 + auth.json),且被 Packagist 索引(或本地用路径方式:
composer create-project ../my-template my-app dev-main) - 推荐在
scripts中定义post-root-package-install,用于自动清理 .git、替换占位符(如sed -i 's/my-vendor/my-new-vendor/g' composer.json)
没有这三步,别人即使拿到你的命令行参数,也拉不到可运行的项目——因为 create-project 只认包定义,不认你本地终端的历史记录。
容易忽略的关键点:版本参数必须加引号,且不能省略
很多人复制命令时漏掉引号,比如写成:
composer create-project symfony/skeleton my-app 7.0.*
结果在 Bash/Zsh 下,7.0.* 被 shell 当作 glob 匹配当前目录下文件,实际传给 Composer 的可能是 7.0.xyz 或空字符串,导致报错 Could not find package 或意外拉取 dev-main。
正确写法永远是:
composer create-project laravel/laravel my-app "11.*"composer create-project myorg/php-skeleton my-app "dev-feature/auth"- CI 脚本中务必加
--no-interaction,否则卡在 “Do you want to remove the existing VCS files?” 提示上
参数不是“导出”出来的,是推演出来的:看你要初始化什么项目、目标环境是否受限、是否需要跳过交互和 VCS 元数据——这些决定了你最终敲进终端的那串字符。











