唯一稳定生效方式是在composer.json根级repositories数组中添加"type": "path"配置;url须为相对或绝对路径,指向含合法composer.json的目录,且name、version、autoload必须严格匹配require声明。

直接在 composer.json 的 repositories 数组里加一条 "type": "path" 配置,是唯一能稳定生效的方式。其他任何“改 require 里加路径”“手动复制进 vendor”“用 package 类型硬写版本”都不可靠,不是报错就是不更新。
本地包的 composer.json 必须合法且匹配
Composer 不会校验语法错误,但遇到问题就静默跳过整个 path 源——你连报错都看不到。
-
name字段必须和你在主项目require中写的包名**完全一致**,包括大小写和斜杠(比如"acme/utils"≠"Acme/utils") -
version字段建议显式写成"dev-main"或"1.0.0";如果留空或只写"dev-master",而主项目又没配"minimum-stability": "dev",就会被稳定性策略过滤掉 - 必须有
autoload(如"psr-4": {"Acme\Utils\": "src/"}),否则类加载失败,不是 Composer 报错,而是运行时报Class not found - 文件不能有多余逗号、单引号、UTF-8 BOM —— 这些都会让 Composer 完全忽略该目录
repositories 配置位置和格式不能错
它必须是根级数组,和 require 同级,不能嵌套在别的字段里,也不能放在 require-dev 下面。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
{
"repositories": [
{
"type": "path",
"url": "../my-local-package"
}
],
"require": {
"acme/utils": "*"
}
}
-
url只接受相对路径(以./或../开头)或绝对路径(如/Users/me/my-local-package),**不能带file://前缀** - Windows 下路径分隔符用正斜杠
/更稳妥(../my-local-package而非..\my-local-package) - 路径必须指向包含
composer.json的目录,不是它的子目录 - 多个 path 源按数组顺序尝试匹配,但实际不依赖顺序——只要
name对得上就行
安装与更新行为取决于 symlink 设置
默认启用符号链接(Linux/macOS)或复制(Windows),但这个行为不是自动“热重载”,而是由 install 或 update 触发的快照。
- 首次引入:运行
composer require acme/utils或composer install - 改了本地包代码后:无需重新
require,但要执行composer update acme/utils才会刷新链接(除非你加了"options": {"symlink": true}并确认 Composer 版本 ≥ 2.2) - 想关掉软链改用复制(比如调试时怕路径泄露):在 repository 配置里加
"options": {"symlink": false} - CI/CD 环境下,path 源默认失效(路径不存在),上线前必须删掉
repositories里的这条,否则构建失败
常见现象和对应检查点
运行完 composer require,vendor/acme/utils 不存在?别急着清缓存,先看这几处:
- 执行
ls -la vendor/acme/utils,如果不是指向源目录的软链(或 Windows 下的完整副本),说明配置根本没被读取 - 检查本地包目录下
composer.json是否能被json_decode(file_get_contents('composer.json'), true)正常解析 - 运行
composer config --list | grep repositories,确认配置已加载(有时 IDE 自动保存失败) - 把本地包的
version改成"dev-main",然后require时显式写"acme/utils": "dev-main",绕过版本解析歧义
path 仓库不走 Packagist 的版本发现逻辑,它只认你本地 composer.json 里写的 name 和 version 字符串。这点最容易被当成“Composer 抽风”,其实是配置和预期不一致。

















