composer原生命令不支持自动识别本地.tar文件,必须通过artifact仓库或package类型仓库显式声明路径、命名和composer.json一致性才能加载。

Composer 原生命令不支持直接安装 .tar 包 —— 它只认 .zip、.tar.gz、.tgz、.tar.bz2 和 .tbz2,但前提是这些包被正确归类为「dist」或置于 artifact 仓库中;单独扔一个 mylib-1.0.0.tar 进目录,不改配置,composer install 会完全无视它。
为什么 composer install 不读本地 .tar 文件
Composer 的安装流程默认只从远程仓库(如 packagist.org)或已声明的本地仓库拉取包,它不会扫描任意目录下的 tar 文件。即使你手动放了一个 vendor/name-1.0.0.tar 在项目里,只要没在 repositories 中声明来源类型和路径,Composer 就当它不存在。
-
.tar是被支持的 dist 格式之一,但必须通过dist.url或artifact仓库显式提供,不能“自动发现” - 常见错误:把
myapp.tar解压后复制进vendor/—— 这绕过了 Composer 的 autoload 注册、脚本执行、插件加载等关键环节,极易导致Class not found或Script not executed - 运行
composer show vendor/name查不到包?说明它根本没被 Composer 索引到,不是路径或权限问题,而是仓库没配对
用 artifact 仓库加载本地 .tar 包的硬性条件
要让 Composer 正确识别并安装 .tar 包,必须满足三要素:命名规则、目录结构、仓库声明。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 文件名必须严格为
{vendor}/{package}-{version}.tar,例如monolog/monolog-2.10.0.tar—— 缺少 vendor 子目录、版本号带-beta后缀、扩展名写成.tar.gz都会导致跳过 - 压缩包内根目录必须直接包含
composer.json,且其中"name"和"version"字段要与文件名完全一致(包括大小写) -
repositories中必须写成:{"type": "artifact", "url": "/absolute/path/to/tar/directory"}路径末尾不加斜杠,且该路径下不能混放其他非 tar 文件(否则索引变慢甚至失败) - 必须禁用 packagist.org:
"packagist.org": false
放在repositories数组外层,否则同名包仍优先走线上源
dist 类型仓库 vs artifact 类型仓库:选哪个
两者都能加载 .tar,但适用场景完全不同。
-
artifact:适合离线分发,目录里放一堆包,Composer 自动扫描匹配所有{vendor}/{pkg}-{ver}.tar;适合 CI 构建产物归档、内网部署 -
dist(package 类型):适合单个包调试,需手动声明每个包的元信息,例如:{"type": "package", "package": {"name": "myorg/mylib", "version": "1.0.0", "dist": {"url": "file:///tmp/mylib-1.0.0.tar", "type": "tar"}}}注意dist.url必须是file://协议绝对路径,且dist.type显式写tar - 别混淆
archive-format配置项 —— 它对composer archive命令无效,原生命令只输出.zip,这个配置只被第三方插件(如composer-archiver)识别
验证 .tar 是否真被加载:看缓存和日志
光看 composer install 成功不等于 .tar 被用了。真正生效的信号藏在细节里。
- 执行
composer install -v,观察输出中是否出现Downloading https://... -> /tmp/xxx.tar或Extracting archive行 —— 如果只有Installing monolog/monolog (2.10.0)没有提取提示,说明它可能从缓存或 packagist 回退下载了 - 检查
vendor/composer/installed.json,找到对应包的dist字段,确认type是tar,url指向你的本地路径 - 删掉
vendor/和composer.lock,再跑composer install --no-cache—— 避免旧缓存干扰判断 - 如果报错
Could not parse version constraint或Package not found,大概率是composer.json里的name和文件名不一致,或路径权限不足(PHP 进程用户无法读取 tar 目录)
最易被忽略的一点:Composer 对 .tar 的支持是「格式兼容」而非「行为等价」——它能解压,但不会像处理 .zip 那样做额外校验;如果 tar 包里多了一层父目录(比如 mylib-1.0.0/src/ 而非 src/),autoload 就会失效,而错误提示往往很模糊。










