必须在主项目composer.json的repositories数组中配置path仓库,url为相对路径(如"./packages/my-utils"),本地包composer.json的name和version字段须与require声明完全一致,三者缺一不可。

怎么在 composer.json 里声明 path 类型仓库
关键不是“加个配置就行”,而是路径、结构、字段三者必须同时满足,缺一不可。path 仓库只认本地目录里的 composer.json,不查网络、不校验远程元数据,但对文件内容极其敏感。
-
url值必须是相对路径(如"./packages/my-utils"),Windows 下可用绝对路径但需带盘符和正斜杠("C:/projects/my-pkg"),反斜杠会解析失败 - 目标目录下必须存在有效的
composer.json,且其中name字段(如"acme/utils")要和你在composer require时写的包名完全一致(大小写敏感) -
version字段必须存在,不能只靠分支名;若用dev-main,则 require 时必须写acme/utils:@dev,否则 Composer 直接跳过该源 - 如果项目已有
composer.lock,且里面记录的是 packagist.org 的 dist URL,得先删掉 lock 文件或运行composer update --lock(在联网机上),否则离线 install 仍会尝试拉远程包
为什么写了 repositories 还报 Could not find package
最常见原因是 Composer 根本没扫描你写的 path 目录——它只在 require 时按 name + version 去匹配已注册的仓库,不会主动遍历所有本地路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 检查
composer config repos输出是否真包含你刚加的 path 条目;若没显示,说明配置没写进项目级composer.json,而可能误写到了全局配置里 - 执行
composer require acme/utils:@dev时,必须确保acme/utils和composer.json里的name完全一致,连空格都不能多一个 - 若目标目录是软链接,且离线机没启用 symlink 支持,需在仓库配置中显式加
"options": {"symlink": false},否则 Composer 读不到真实路径下的文件 - 别依赖
composer install自动发现:它只按 lock 文件装,不会重新解析 repositories;新包必须走require
path 仓库和 artifact 仓库能混用吗
能,但行为完全不同,混用时容易误判失败原因。path 是开发态直读源码,artifact 是部署态校验压缩包,二者触发时机和校验逻辑互不干扰。
- path 类型不生成任何缓存,每次 require 都实时读取目标目录下的
composer.json和文件结构;适合联调,不适合打包分发 - artifact 类型要求所有
.tar.gz包命名严格为vendor/name-version.tar.gz,且包内composer.json的name和version必须与文件名一字不差,否则校验失败直接中断,不 fallback 到其他源 - 若同时配置了 path 和 artifact,Composer 会按
repositories数组顺序依次查找;但一旦某个源返回 “package not found”,它不会继续试下一个,而是报错——所以要把更确定的源(比如已知存在的 path)放前面 - 禁用 packagist.org 不等于禁用 fallback:必须全局执行
composer config --global repo.packagist false,再确认项目级composer config repo.packagist输出为空,否则哪怕你写了两个本地源,Composer 仍可能在最后去 resolve.packagist.org 查一次
离线 require 新包时 vendor 目录权限和结构要注意什么
离线环境下没有网络兜底,vendor 目录的写入失败或结构残留会直接导致 autoload 失效,且错误信息往往不明确。
- 确保
vendor/可写,且父目录有足够 inode;某些内网系统默认挂载为noexec或nosuid,会导致composer require创建 symlink 失败 - 不要手动复制 vendor 子目录进去;path 仓库 require 后,Composer 会在 vendor 下建
acme/utils符号链接(或硬拷贝,取决于 options),若已有同名目录,会报Destination vendor/acme/utils already exists - 若项目用了
"autoload": {"psr-4": {...}},但 path 包里没对应命名空间或没跑composer dump-autoload,类就加载不到——这不是网络问题,是 autoloader 缓存没更新 - PHP 版本不一致时,vendor 里可能含
match表达式或属性装饰器等语法,require 会直接 parse error;离线机 PHP 小版本最好和构建机一致(比如都是 8.2.12)
@dev、忘了删旧 lock、忘了检查 symlink 权限——这些点不爆错,但会让整个流程静默失败。










