根本原因是composer默认只查packagist,未在主项目composer.json的repositories中显式声明path类型源;必须配置"type":"path"、相对路径url、require时用dev-main等分支别名,且本地包name需与require完全一致。

为什么 composer require 找不到本地包
根本原因不是路径写错,而是 Composer 默认只认 Packagist 上发布的包。本地目录哪怕放对了、composer.json 也写全了,只要没在项目根 composer.json 的 repositories 里显式声明为 path 类型,它就完全无视那个目录。
常见错误现象:Could not find package acme/core at any version,或者装进 vendor/ 的是远程同名包而非你本地改的代码。
-
repositories必须写在你 Laravel 应用(或主项目)的根composer.json里,不能写在本地包自己的composer.json中 - 路径值要用相对路径(如
"../packages/core"),避免硬编码绝对路径,否则换机器就失效 - 本地包目录下必须已执行过
git init && git add . && git commit -m "init",否则 Composer 拒绝加载 - 本地包的
composer.json中name字段(如"acme/core")必须和你在主项目中require的名字完全一致
dev-main 是唯一靠谱的版本写法
别写 "^1.0",也别信 "*" 或留空——这些都会让 Composer 去 Packagist 查远程包,而不是走你配的 path 仓库。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
dev-main 不是版本号,是分支别名;Composer 会直接读取本地 Git 仓库当前 HEAD 所在分支的代码,实时生效。
- 如果本地包默认分支是
develop,就得写"dev-develop",并确保你当前在该分支上 - 执行
composer update acme/core比全量update更安全,避免误刷其他依赖 - 改完本地包代码后,不需要重新
require或install,但要运行composer dump-autoload让 PSR-4 映射更新(尤其新增类时) -
version字段在本地包的composer.json中可写可不写,它被完全忽略
Laravel 应用里 Class not found 怎么查
即使 composer install 成功、vendor/acme/core 看起来是符号链接,也常出现 Class not found。这不是 Composer 加载失败,而是自动加载没映射到你的命名空间。
- 检查本地包自己的
composer.json是否有正确的autoload块,例如:"psr-4": {"Acme\Core\": "src/"} - Laravel 不会自动扫描
vendor/外的目录,所以主项目的composer.json里无需额外加 autoload 配置——只要本地包自己配对了,Composer 就能生成对应加载逻辑 - 运行
composer show acme/core,确认输出里显示的是source: path ../packages/core,而不是dist: zip或远程 URL - 用
ls -l vendor/acme/core确认它是符号链接(指向../packages/core),否则说明path配置未生效,可能被其他仓库类型覆盖
Monorepo 下多个本地包共存要注意什么
一个根 composer.json 可以配多个 path 仓库,但顺序和命名冲突是隐形雷区。
-
repositories数组里,path类型应放在最前面,避免被后面的vcs或packagist回退机制劫持 - 所有本地包的
name必须全局唯一,比如acme/core和acme/logging可以共存,但不能两个都叫acme/utils - 不同包用不同分支名隔离开发节奏(如
dev-stable/dev-next),但不要指望 Composer 能“版本隔离”——它们共享同一份composer.lock快照,升级一个就会连带更新所有@dev包 - CI 流程中,若需发布正式版,必须打 Git tag 并推送到私有仓库(如 Satis),再把主项目里的
require改成"^2.0",否则永远走不了语义化版本那一套
autoload 是否自洽、以及 dev-main 这个字符串必须和 Git 分支名严格一致——大小写、连字符、下划线,差一点就 fallback 到远程查找。










