composer不支持直接require本地zip包,须配置artifact仓库:将含合法composer.json的zip放入指定目录,composer.json中添加type为artifact的repositories配置,路径末尾需加斜杠,然后执行composer update。

直接用 composer require 安装本地 Zip 包行不通
Composer 默认不支持直接从本地 .zip 文件安装包,比如 composer require ./mylib.zip 会报错 Could not find a version of package ... matching your minimum-stability。这不是路径写错,而是 Composer 的依赖解析器根本不会把本地文件当仓库源处理。
真正可行的路只有一条:把 Zip 包当作 artifact 仓库 使用 —— 即让 Composer 把某个目录当成“存着一堆已打包好的 tar/zip 的静态文件仓库”,它会自动扫描、索引并按 name 和 version 解析。
- Zip 包必须包含合法的
composer.json(含name、version、autoload等必要字段) - Zip 文件名无关紧要,但内容结构必须是「解压后根目录即为包源码」,不能套多一层文件夹
- 所有 Zip 包统一放在一个空目录下(如
./artifacts/),不要嵌套子目录
配置 artifact 类型仓库的正确写法
在项目根目录的 composer.json 中添加 repositories 配置段,类型必须为 artifact,路径填绝对或相对于 composer.json 的目录路径:
{
"repositories": [
{
"type": "artifact",
"url": "./artifacts/"
}
]
}
注意:url 值末尾的斜杠 / 不能省,否则 Composer 会静默忽略该仓库;路径不支持 ../ 向上跨级(部分版本会失败),建议用同级目录。
- 执行
composer clear-cache再运行composer update或composer require vendor/name - 如果包未被识别,运行
composer diagnose查看是否报Invalid repository type "artifact"(说明 Composer 版本太低,需 ≥ 1.0.0) -
artifact仓库不支持版本别名(如dev-master),必须使用composer.json中声明的精确版本号(如1.2.3)
Zip 包里 composer.json 的关键字段不能少
哪怕只是临时测试,Zip 包根目录下的 composer.json 至少得有这三项,否则 Composer 扫描时会跳过该包:
{
"name": "acme/utils",
"version": "1.0.0",
"autoload": {
"psr-4": { "Acme\": "src/" }
}
}
-
name格式必须是vendor/package,且和你require时写的完全一致 -
version必须是规范语义化版本(如1.0.0),不能写dev或latest - 如果包没加
autoload,安装后无法自动加载类,require会报Class not found - 无需发布到 Packagist,也无需
dist/source字段 ——artifact模式只认 Zip 本身
为什么不用 path 仓库替代?
有人试过用 "type": "path" 指向解压后的目录,确实能 work,但它要求目标目录存在且可读,无法复现“分发一个 Zip 就能让别人安装”的场景。而 artifact 是唯一支持纯 Zip 分发的内置方案。
真正的坑在于:一旦配置了 artifact,Composer 会扫描整个目录下所有 .zip 和 .tar.gz,如果混入损坏包或命名冲突包(比如两个 acme/utils 但不同 version),可能触发不可预期的版本选择 —— 建议每个 artifact 目录只放当前项目明确需要的 Zip,并定期清理。










