必须在主项目composer.json的repositories数组中显式配置type:"path"条目,url指向含合法composer.json的本地目录,且name、版本与require严格一致;否则composer无法发现包。

怎么让 Composer 从本地目录读包
必须用 path 类型仓库,不能靠“复制 vendor”或“改 repo.url”蒙混过关。Composer 只认 repositories 数组里显式声明的 type: "path" 条目,且该路径下必须有合法 composer.json。
常见错误现象:Could not find a matching version of package my-vendor/my-lib,哪怕你已把代码放在 ./packages/my-lib 下——因为没在 composer.json 里注册这个路径。
- 在项目根目录
composer.json的repositories字段添加一项:"repositories": [ { "type": "path", "url": "./packages/my-lib" } ] -
url必须是相对路径(如../my-pkg)或绝对路径(Windows 要带盘符,如C:/projects/my-pkg);不能用file://协议 - 目标目录下必须有完整
composer.json,至少含name(格式为vendor/name)和version(如"dev-main"或"1.2.3"),否则匹配失败 - 执行
composer require my-vendor/my-lib:dev-main(版本号必须和本地包的version或分支名一致)
为什么设了 path 仓库还是连不上
不是路径写错,而是 Composer 在后台仍试图 fallback 到 Packagist。即使 repositories 里只写了 path,只要全局配置里还留着默认源,它就会在匹配失败后自动查远程。
典型报错:Could not find package my-vendor/my-lib in a version installable using your PHP version,其实本地包完全合法,只是被远程校验劫持了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer config --global repo.packagist false彻底禁用全局 Packagist 源 - 检查是否残留
composer.json里的"repositories": [{"type": "packagist", "url": false}]—— 这种写法在COMPOSER_DISABLE_NETWORK=1下会直接退出,不是忽略 - 确认没有设置
COMPOSER_HOME指向其他配置目录,避免读到旧的全局 config
离线时怎么避免插件和脚本偷偷联网
就算 path 配对成功,composer require 默认仍会触发插件初始化和 post-install-cmd 脚本,而某些插件(如 hirak/prestissimo、symfony/flex)内部会尝试访问 GitHub 或 Packagist。
结果就是:包明明在本地,却卡在 Downloading 或报 Connection refused。
- 强制禁用所有插件:
COMPOSER_DISABLE_NETWORK=1 composer require my-vendor/my-lib:dev-main --no-plugins --no-scripts -
--no-plugins是硬性前提,不加它,--no-scripts和--no-autoloader都可能被插件绕过 - 如果项目用了
minimum-stability: dev,版本约束必须加@dev后缀,例如my-vendor/my-lib:dev-main@dev,否则匹配逻辑会跳过本地 path 源
path 仓库的符号链接行为怎么应对
Composer 把 path 包当“可编辑源”,默认在 vendor/ 下建软链接(Linux/macOS)或复制(Windows),而不是拷一份静态副本。这在调试时方便,但部署时容易出问题。
典型问题:生产机上删了源目录,require 还能跑,但 class_exists() 突然返回 false;或者 Windows 上权限不足导致 symlink 创建失败,降级成 copy 后又因路径硬编码失效。
- 想强制复制而非链接:在
composer.json里加"options": {"symlink": false}到对应path条目中 - 想确保 vendor 内容完全独立,执行完
require后立刻运行composer dump-autoload -o,否则 autoload.php 可能仍引用原路径 - CI/CD 打包前,建议先
rm -rf vendor/,再用composer install --no-dev --optimize-autoloader重建,避免残留 symlink 污染
psr/log,而该项目没提前把 psr/log 也配成 path 仓库,install 仍会去远程找——它不会递归解析本地包的 composer.json 并自动注册其依赖。










