答案是:必须在主项目composer.json的repositories中配置{"type":"path","url":"../my-package"}并添加"options":{"symlink":true},再执行composer update acme/utils;本地包需有合法composer.json且name与require一致,url用相对路径,版本用dev-main。

直接结论:用 repositories 配 {"type":"path","url":"..."},不是往 require 里塞路径;本地包改了代码不生效?默认是复制,得配 "options": {"symlink": true} 并执行 composer update vendor/name。
为什么 composer require vendor/name:dev-main 报 “Could not find package”
根本原因不是网络或权限,而是 Composer 根本没“看见”你的本地目录。它只在 repositories 数组里找源,require 字段只负责声明“我要哪个包”,不负责“去哪找”。
-
repositories必须写在主项目(即你正在开发的那个项目的)composer.json里,不能写在本地包自己的composer.json中 -
url必须是相对路径(如"../my-package"),绝对路径在 Windows 上极易静默失败(盘符、反斜杠、空格都会中断) - 本地包目录下必须有合法的
composer.json,且其中name字段(如"acme/utils")要和require里写的完全一致(大小写敏感) - 版本约束必须用
dev-main、dev-develop这类分支名,不能写1.0.0—— path 源下 Composer 忽略version字段,只认当前 Git HEAD 所在分支
怎么让改完本地包代码立刻在主项目里生效
默认行为是复制(copy),不是链接(symlink)。这意味着你改了 ../my-package/src/Helper.php,vendor/acme/utils/Helper.php 还是旧文件。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须显式启用符号链接:在主项目
composer.json的repositories条目里加"options": {"symlink": true} - 或者,在本地包自己的
composer.json里加同样字段(效果等价) - 执行
composer update acme/utils(不是dump-autoload),才会重建 symlink - 验证是否成功:
ls -la vendor/acme/utils应显示箭头指向源目录;Windows 用户用dir vendor\acme\utils看是否为“快捷方式”类型 - 注意:Windows 需开启开发者模式或以管理员权限运行命令行,否则 symlink 创建会失败且无提示
path 仓库和普通远程仓库的关键区别在哪
不是“能不能装上”,而是“怎么装、怎么更新、怎么维护”。path 类型跳过所有元数据请求(不连 Packagist、不查 packages.json),直接读取本地 composer.json 内容,因此它天然离线、极快,但也更脆弱。
- 不支持
composer install自动发现:必须先require,再update,否则vendor里什么都不会有 - 无法自动同步版本号:本地包改了
composer.json里的version,主项目不会感知,除非手动composer update - 通配符路径(如
"../packages/*")能批量注册多个本地包,但每个包仍需独立的name和合规composer.json - 发布前务必删掉
repositories里的 path 条目——否则 CI 构建会失败,或把本地路径误当成正式依赖
最常被忽略的是:symlink 不是默认行为,也不是“配置一次永久生效”。每次 composer install 或 update 都会重新评估,如果 options.symlink 缺失或系统不支持,它就退回到复制。别只看文档说“支持 symlink”,得亲眼确认 vendor/ 下确实是链接,而不是一堆静态副本。










