唯一能保证“改代码立刻生效”的方式是配置path类型仓库:需在主项目composer.json根级写repositories,url用显式相对路径(如"../my-local-package"),本地包含合法composer.json且name严格匹配,require用"@dev"或"dev-main",并启用"options":{"symlink":true}确保软链接生效。

直接用 path 类型仓库,这是唯一能保证“改代码立刻生效”的方式。其他方法(比如手动 symlink、改 vendor、清缓存)都绕不开 Composer 的包解析逻辑,治标不治本。
怎么配 repositories 才让 Composer 看得见本地包
必须写在主项目根目录的 composer.json 最外层,不能嵌套在 config、extra 或 require 里:
"repositories": [
{
"type": "path",
"url": "../my-local-package"
}
]
-
url是相对于该composer.json文件的路径,推荐用../xxx这种显式相对写法;~、$HOME、绝对路径(如C:/xxx或/home/user/pkg)基本都会失败 - 路径必须指向一个含合法
composer.json的目录,且该文件里必须有name字段,格式为小写字母+短横线,例如"acme/utils"—— 大小写、下划线、空格全都不行 - 如果本地包是 Git 仓库,它必须已
git init并至少有一个 commit;否则 Composer 会静默 fallback 到 dist 安装 - 多个仓库时,把
path条目放在repositories数组最前面,避免 Packagist 先命中同名包
require 写什么版本才不会被忽略
别写 ^1.0、1.0.0 或 dev-master —— 这些稳定版或分支名约束会让 Composer 跳过 path 源。真正起作用的是 @dev 或明确匹配的开发分支名:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 最稳写法:
"acme/utils": "@dev"—— 强制走 path 解析,无视本地包有没有version字段 - 若本地包
composer.json明确写了"version": "1.0.x-dev",则 require 必须写"1.0.x-dev",不能简写为"1.0.x" - 写
"dev-main"前先确认本地包 Git 里真有main分支;没 Git 的话,@dev更可靠 - 本地包
composer.json中不能有"type": "project",否则 Composer 直接跳过加载
为什么 vendor/acme/utils 不是软链接
默认行为就是可能 fallback 到复制,不是 bug,是权限或配置导致的预期外回退:
- Linux/macOS:运行
ls -la vendor/acme/utils,输出里没有->箭头,说明 symlink 失败;检查config.symlinks是否被设为false(全局或项目级) - Windows:必须启用“开发者模式”或以管理员身份运行终端;Git Bash/WSL 下注意路径分隔符统一用
/ - Docker:挂载宿主机目录时,需加
follow_symlinks=1选项,否则容器内无法解析符号链接 - 强制启用 symlink 的写法(推荐加到
repositories条目里):"options": {"symlink": true} - 验证是否成功:
readlink vendor/acme/utils(Linux/macOS)或dir vendor\acme\utils(Windows),输出应为源路径或提示“符号链接”
改了代码却没生效?优先查这三处
不是 IDE 缓存或 opcache 的问题,而是底层链路断了:
- 本地包 Git 工作区是“脏”的(有未提交修改)——Composer 默认拒绝 symlink,会静默 fallback 到 copy;解决:先
git add -A && git commit -m "wip",或加"options": {"symlink": true} - 本地包
composer.json的autoload配置没覆盖实际类路径,比如 PSR-4 的命名空间前缀和目录映射写反了;执行composer dump-autoload只影响主项目,不会 reload symlink 包的 autoloader - IDE(如 PHPStorm)默认不跟随符号链接,或缓存了旧路径映射;PHPStorm 需在 Settings > Directories 中把
vendor/acme/utils设为 Excluded,再把../my-local-package设为 Sources
真正容易被忽略的是:symlink 成功 ≠ 类自动加载就一定通。路径、命名空间、Git 状态、IDE 索引,四个点只要一个没对齐,就会表现为“改了但没生效”。










