关键在于启用symlink并确保其生效:改本地包代码后,主项目new类即用新逻辑;需验证symlink(macOS/Linux用ls -l vendor/name,Windows用dir vendor ame),避免因无git commit、权限不足或config禁用导致静默fallback为copy。

本地包开发流程能大幅简化,关键不是反复改主项目的 composer.json,而是把配置“一次写对、长期复用”。
怎么让本地包改代码后立刻生效,不跑 composer update
核心是启用 symlink 并确保它真在起作用。Composer 默认对 path 类型仓库启用符号链接,但会静默 fallback 到 copy 模式——这时你改了包代码,主项目里完全感知不到。
- 验证是否真用了 symlink:
ls -l vendor/acme/utils(macOS/Linux)或dir vendorcmeutils(Windows),看到->或<symlinkd>才算成功 - 常见 fallback 原因:本地包目录没执行过
git init && git commit;Windows 下终端没以管理员身份运行;主项目composer.json里显式写了"config": {"symlinks": false};本地包目录权限不足 - 只要 symlink 生效,你在本地包里改
src/Helper.php,主项目里new Helper()就直接用新逻辑,连composer dump-autoload都不用
本地包的 composer.json 怎么写才不踩坑
主项目能不能识别并加载本地包,90% 取决于这个文件是否合规。它不是摆设,是 Composer 查找、匹配、安装的唯一依据。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
name字段必须和主项目require中的包名**完全一致**,比如主项目写"acme/utils": "dev-main",本地包就得是"name": "acme/utils" -
version推荐设为"dev-main"(对应主项目 require 的"dev-main"),或者统一用"@dev"——后者更省事,不依赖本地包的 version 字段,也不查 Packagist -
autoload必须正确,比如"psr-4": {"Acme\Utils\": "src/"},否则类根本不会被自动加载 -
url在主项目repositories里必须是**相对于主项目composer.json的显式路径**,例如"../acme-utils",别用~/、$HOME或环境变量
多个本地包怎么避免每个项目都重复写 repositories
如果你同时调试 acme/utils、acme/api-client、acme/logger,每次都在各项目里复制粘贴 repositories 配置,纯属自我消耗。
- 用 Composer 全局配置一次:
composer config -g repositories.acme-path '{"type":"path","url":"~/dev/acme/*"}' -
url支持*通配符,会自动扫描~/dev/acme/下所有含合法composer.json的子目录 - 全局配置后,主项目
composer.json里就完全不用写repositories了,只保留require即可 - 注意:全局配置只影响当前用户,不同系统用户需各自执行;若某项目想临时禁用,可在项目级
config里加"disable-tls": true等覆盖项
删掉本地包目录后为什么没报错?
这是最容易被忽略的“假正常”现象:删掉 ../acme-utils 目录后,composer install 不报错,但该包直接被跳过——主项目里 new Utils() 会抛出 Class not found。
- Composer 对 path 类型源的处理是“尽力而为”,找不到目录就静默跳过,不像 Packagist 源那样明确报
Could not find package - 所以日常开发中,建议在 CI 或本地 pre-commit hook 里加一行检查:
test -d ../acme-utils || (echo "ERROR: local package missing" && exit 1) - 另一个信号是
vendor/acme/utils目录消失,且composer show acme/utils返回空——这不是 bug,是设计如此,但容易误判为“安装成功”

















