path仓库必须写在项目级composer.json里,不能全局配置;repositories需为对象而非数组;本地模板须含"type":"project"和合法name/version;create-project需加--stability=dev及--repository-url=file://绝对路径。

path仓库必须写在项目级composer.json里,不是全局配置
Composer 的 path 类型仓库只在当前项目的 composer.json 中生效,composer config -g 完全不认它。你想用本地模板当脚手架,就得把 repositories 直接塞进目标项目的根 composer.json,不能指望全局设置“透传”过去。
常见错误是:在 ~/.composer/config.json 里加了一堆镜像,然后以为 path 也能这么配——结果 composer require myorg/skeleton 一直报 Could not find package,其实根本没去查你本地目录。
-
repositories字段必须是对象({}),不是数组([]),否则path条目会被忽略 -
url值推荐用相对路径,比如"./skeletons/my-project",避免换机器后路径失效 - 本地模板目录里必须有合法的
composer.json,且含"name"和"version"(哪怕写"dev-main")
模板包的type必须是project,否则create-project只是复制进vendor
composer create-project 能否把你的本地模板当脚手架用,关键看它的 composer.json 顶层有没有 "type": "project"。没有这行,Composer 就把它当普通库处理,最终只是 require 进 vendor/,而不是展开成完整项目结构。
你本地模板的 composer.json 至少得长这样:
{
"name": "myorg/my-skeleton",
"type": "project",
"version": "dev-main",
"autoload": { "psr-4": { "App\": "app/" } },
"scripts": {
"post-create-project-cmd": [
"@php -r "copy('.env.example', '.env');"",
"@php artisan key:generate"
]
}
}
- 别在模板里写
"require": { "myorg/my-skeleton": "*" },会触发循环依赖 -
post-create-project-cmd必须定义在模板自身的composer.json里,不是你执行命令的那个空目录 - 钩子脚本运行时工作目录是新建项目根目录,所有路径都得基于那里算
create-project拉本地path模板要加--stability=dev
默认情况下,composer create-project 只搜 stable 版本。你本地模板大概率没打 tag,version 是 "dev-main" 或 "1.0.x-dev",不加参数就直接报 Could not find package ——不是包名错了,是稳定性过滤掉了。
正确命令是:
composer create-project myorg/my-skeleton myapp --repository-url=file://$(pwd)/skeletons/my-project --stability=dev --remove-vcs
-
--repository-url指向本地模板目录,注意要用file://协议 + 绝对路径($(pwd)确保可靠) -
--remove-vcs很关键,不然新项目里带着模板的 .git,首次git init后一提交就把原始历史带出去了 - 别信
composer config repo.xxx对path有效——这个命令只对composer类型仓库起作用
删掉vendor和composer.lock再install,否则旧dist URL照旧404
改完 repositories 或换了 path 源之后,如果直接 composer update,Composer 会复用 composer.lock 里原来记录的 dist URL(比如 packagist.org 的 zip 链接),导致下载阶段依然 404。这不是缓存问题,是 lock 文件锁死了旧地址。
必须执行三步清理:
- 删掉
vendor/目录 - 删掉
composer.lock - 再跑
composer install(不是update)
这时候 Composer 才会重新解析 repositories,从你指定的本地路径读取模板元数据,生成新的 lock 文件。漏掉任何一步,都可能卡在 “Loading composer repositories” 或 “Downloading …”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











