能,但需显式配置私有仓库为vcs类型并确保骨架含合法composer.json且"type":"project";占位符替换依赖自定义脚本而非原生命令;vendor为空多因require缺失或稳定性约束过严;排除文件需用.gitattributes export-ignore。

create-project 能不能直接用私有 Git 仓库当骨架
能,但默认会失败——Composer 默认只信任 packagist.org 上的包,私有仓库需要显式配置。不加配置直接运行 composer create-project vendor/skeleton 会报 Could not find package vendor/skeleton 或 Repository not found。
实操建议:
- 在项目根目录或全局
composer.json中添加私有仓库声明,类型必须是vcs,URL 指向 Git 地址(支持 HTTPS/SSH) - 如果仓库无
composer.json或缺少type: project,create-project会跳过安装逻辑,退化为普通git clone - 确保目标仓库的默认分支(如
main)包含合法的composer.json,且含"type": "project"字段,否则 Composer 不识别为可展开的骨架
如何让 create-project 自动替换占位符(如 vendor/name)
Composer 本身不解析或替换模板变量,所谓“自动替换”实际依赖骨架仓库中预置的 composer create-project 钩子脚本或第三方插件(如 symfony/flex),原生命令只做文件复制和依赖安装。
实操建议:
- 在骨架的
composer.json中定义scripts,例如"post-root-package-install"阶段调用自定义 PHP 脚本,用str_replace()批量处理.env、config/*.php等文件中的__VENDOR__占位符 - 避免在
autoload或require中硬编码占位符名;替换逻辑应仅在首次创建时触发,可通过检查vendor/autoload.php是否已存在来判断是否为新项目 - 若使用 SSH 克隆私有仓库,注意脚本执行时无交互终端,
readline()类函数会失败,需改用命令行参数传入替换值
为什么 create-project 后 vendor 目录空或依赖没装
常见于骨架仓库的 composer.json 缺少 "require" 或误设了 "minimum-stability": "stable" 但依赖包只有 dev 版本——此时 Composer 宁可跳过安装也不降级稳定性。
实操建议:
- 运行时加
--no-interaction --prefer-dist --no-plugins排除交互与插件干扰;再加-v查看详细日志,重点找Resolving dependencies后是否出现Nothing to install - 确认骨架中
composer.json的"require"是真实依赖项,不是仅用于文档说明的伪条目;空require块会导致vendor/不生成 - 若依赖私有包,骨架的
composer.json必须同步声明对应仓库,不能指望用户本地全局配置——create-project是隔离环境,只读取当前骨架内的配置
怎么跳过某些文件或目录(比如 .git、.github)不复制到新项目
Composer 没有内置 exclude 列表机制。create-project 本质是 git clone + composer install,所有 Git 仓库里的文件(包括 .git)都会被拉下来,但 .git 目录会在克隆后被自动删除——这是唯一被明确清理的目录。
实操建议:
- 在骨架仓库中把不想传播的文件放进
.gitattributes并标记为export-ignore,例如:docs/ export-ignore<br>.github/ export-ignore<br>.editorconfig export-ignore
,这样create-project使用git archive方式拉取时会跳过它们 - 不要依赖
.gitignore——它只影响未跟踪文件,对已提交内容无效 - 如果骨架用了 GitHub Template 功能,注意其生成逻辑与 Composer 无关,二者混用易导致
.git未清空或 CI 配置残留
composer.json 中 type 和 require 的隐式约束、以及 create-project 对子进程脚本的静默失败容忍——这些地方没日志、不报错,只安静地跳过该做的事。


















