composer不支持composer require ./xxx.zip,因其仅识别vendor/name格式包名,会将路径误作包名查询packagist而报错;须通过package或artifact类型仓库显式声明本地zip。

composer require ./xxx.zip 为什么报错
因为 composer require 只接受 vendor/name 形式的包名,不支持文件路径。你输入 composer require ./mylib-1.0.0.zip,Composer 会把它当做一个包名去 packagist.org 查找,自然返回 Could not find a matching version of package ./mylib-1.0.0.zip。
这不是命令写错了,是根本没这个功能——Composer 没有“直接安装单个 zip”的命令入口。
用 package 类型仓库手动声明本地 zip
这是最可控、最不容易受环境干扰的方式,适合单个离线包、临时验证或 CI 中注入内部组件。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
dist.url必须是file:///开头的绝对路径(Linux/macOS)或file://加盘符(Windows),例如file:///tmp/mylib-1.0.0.zip;相对路径如./packages/mylib-1.0.0.zip在某些 PHP 版本下可能失败 - 压缩包解压后根目录必须直接包含合法的
composer.json,不能套着一层mylib-1.0.0/目录 -
repositories中要完整写出name、version、type、dist和autoload,Composer 不会自动读取 zip 内的composer.json - 改完
composer.json后必须运行composer update vendor/name(不是install),否则新定义不会生效
用 artifact 类型仓库批量管理本地 zip
适合有多个内部包、需要复用同一套离线分发流程的场景,比如构建内网私有源前的过渡阶段。
-
url字段必须是目录路径,不能是 zip 文件路径;末尾不加斜杠,例如"./packages",写成"./packages/"在 macOS 上可能静默失效 - 所有 zip 文件必须严格按
{vendor}/{package}-{version}.zip命名,例如acme/utils-3.2.1.zip,且内部composer.json的name和version必须完全一致 - 如果项目没禁用 packagist.org,默认它优先级最高;要确保走本地,得在
repositories顶部加上{"packagist.org": false} -
composer install不会重新扫描 artifact 目录,只有composer update或首次install时才索引新增 zip
别忽略路径权限和缓存残留
本地安装最容易卡在看不见的地方:路径不可读、符号链接断开、lock 文件锁死旧版本。
- Linux/macOS 下用
sudo composer生成的 vendor 链接,后续普通用户执行composer update会因权限拒绝失败 - 换过 zip 文件内容但没删
vendor/和composer.lock,Composer 仍按 lock 里记录的哈希校验,导致安装旧版或报 hash mismatch - Docker 中挂载
./packages到容器内,宿主机路径变更后,容器内file://路径可能已失效,需检查容器内是否真能cat /path/to/pkg.zip










