path仓库配置必须写在根composer.json的repositories字段中,且为索引数组,每项形如{"type":"path","url":"packages/my-sdk"},url须为相对路径,改后需clear-cache,require版本必须用*@dev等本地标识,否则composer将忽略本地包而访问packagist。

path仓库配置必须写在根composer.json里,否则子包根本不会被识别
Composer 不会自动扫描子目录下的 composer.json,哪怕你每个包都配得再规范。它只认当前工作目录(即项目根)的 composer.json 里 repositories 字段声明的内容。
常见错误现象:在 packages/my-sdk/composer.json 里写了 "name": "acme/my-sdk",但根项目 require 时提示 could not find package acme/my-sdk——因为根项目根本没告诉 Composer “这个目录是个包源”。
-
repositories必须是索引数组,每项是{"type":"path","url":"packages/my-sdk"}这种结构,不能写成对象键值对 -
url是相对于根composer.json的路径,不能以./开头,也不能用绝对路径(协作必崩) - 如果子包在
packages/core/v2,"packages/*"不会自动命中,必须显式加一条"packages/core/v2" - 改完
repositories后,务必先运行composer clear-cache,否则可能读旧缓存导致路径不生效
require里的版本必须用*@dev,别写^1.0或dev-main
本地 path 包不参与语义化版本解析,写 "acme/my-sdk": "^1.0" 的后果是:Composer 跳过你的本地目录,转头去 Packagist 找已发布的 1.x 版本,你改的代码完全不会加载。
正确写法只有三种:"*@dev"、"@dev"、"dev-main"(后者需确保子包分支名确实是 main)。它们都表示“无条件取本地最新”,不走远程匹配逻辑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 子包
composer.json中的version字段可省略,Composer 不读它;真正起作用的是name和路径一致性 - 多个子包互相依赖时,被依赖方也得在根
repositories里声明,否则 Composer 解析依赖树时会卡住 - CI 环境中若禁用了 symlink(比如某些 Windows 容器),
@dev仍能工作,只是变成复制而非链接
vendor里不是复制而是符号链接?那得确认symlink选项和系统支持
预期中 vendor/acme/my-sdk 应该是指向 packages/my-sdk 的软链,这样改子包代码主项目立刻可见。但实际看到的是完整复制——说明 symlink 没建成功。
原因可能是:Windows 终端未以管理员身份运行、未开启“开发者模式”;Linux/macOS 文件系统挂载了 noexec 或 nosymfollow;或者 Composer 版本太老没默认启用。
- 最稳妥方案是在
repositories条目里显式加"options": {"symlink": true} - 执行
composer install前,确保vendor/目录为空,否则旧复制残留会干扰链接创建 - 验证是否成功:运行
ls -la vendor/acme/my-sdk,输出含-> packages/my-sdk才算真链接 - 一旦链接失败,Composer 自动 fallback 到 copy 模式,但不会报错——这是静默退化,得自己检查
改了子包代码,vendor里还是旧的?别信dump-autoload
composer dump-autoload 只刷新自动加载映射表(即 vendor/composer/autoload_*.php),它完全不碰包内容同步。你改了 packages/my-sdk/src/Client.php,运行完 dump 后 vendor/acme/my-sdk/src/Client.php 仍是旧文件。
真正触发同步的是 composer update,且必须带 --with-dependencies 参数,否则可能跳过已安装的 path 包。
- 推荐命令:
composer update acme/my-sdk --with-dependencies - 如果子包有变更但没改
composer.json,Composer 可能认为“无需更新”,此时可加--force强制重拉(Composer 2.2+ 支持) - 更激进但有效的方式:
rm -rf vendor/acme/my-sdk && composer update acme/my-sdk - 测试类无法被根项目
phpunit找到?是因为autoload-dev默认不启用 path 包的 dev 配置,需在根composer.json的autoload-dev里手动加子包的tests/路径










