artifact仓库本质是支持离线zip安装的类型,需配置"type":"artifact"和绝对路径,自动扫描.zip/.tar内composer.json构建元数据,不依赖文件名,但要求包结构完整且含合法composer.json。
本地 artifact 仓库的本质是
类型仓库,不是
或
很多人误以为把 zip 包扔进某个文件夹、再配个
仓库就能装,结果报错
。根本原因:Composer 的
仓库只认源码目录(含
),不支持直接解析 zip;而真正支持离线 zip 安装的,是
类型仓库。
仓库会扫描指定目录下所有
和
文件,自动提取其中的
来构建包元数据。它不要求 zip 解压,也不要求包名与文件名一致——只要 zip 内部有合法的
即可。
必须使用
,不能写成
或漏掉
路径必须是**绝对路径**(Windows 下如
,Linux/
mac
OS 下如
),相对路径会被忽略
子目录也会被递归扫描,但符号链接(symlink)默认不跟随(除非加
)
配置
启用 artifact 仓库
在项目根目录的
中添加
配置段。注意顺序:本地
应放在 packagist.org 之前,否则 Composer 仍会优先联网查询。
如果只是临时测试,也可用命令行一次性指定:
,但该方式不持久,且无法同时指定多个仓库。
多个 artifact 目录需写多个
对象,不能用逗号或分号拼接路径
值末尾斜杠可有可无,但路径中不能含通配符(如
)
若 zip 包内
中的
字段缺失或格式非法,该 zip 会被跳过,且无明确错误提示——建议用
检查 zip 内容
打包规范:zip 必须包含完整包结构,不能只放
一个能被
正确识别的 zip,必须解压后能直接构成一个标准 Composer 包目录。常见错误是只压缩了
目录,导致解压后找不到
。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
正确结构示例(压缩前):
然后对整个
目录打包(不是只选中
),生成
,放到 artifact 目录即可。
文件名随意,
不依赖文件名匹配版本或包名
支持语义化版本号,只要
里写了
,安装时写
就能命中
如果 zip 内没有
字段,Composer 会尝试从文件名推断(如
→
),但不可靠,强烈建议显式声明
离线安装失败的三个高频原因
即使配置了 artifact,
仍可能失败,往往卡在依赖解析阶段。核心问题不在下载,而在元数据是否完备。
依赖链中某个包未放入 artifact 目录(比如
依赖
,但后者没放 zip)——
不会自动补全依赖,所有 require 的包都得手动备齐
zip 内
缺少
或
字段,导致 Composer 认为这不是有效包
PHP 版本约束冲突:
中的包声明了
,但当前环境是 PHP 7.4,Composer 会静默跳过该包(不报错),最终找不到满足条件的版本
验证是否真离线:运行
,观察日志中是否出现
;如果看到
,说明仍在联网,大概率是仓库配置未生效或包未命中。
artifactpathpackagepathCould not find package xxx at version yyypathcomposer.jsonartifactartifact.zip.tarcomposer.jsoncomposer.json"type": "artifact""type": "package"typeC:/my-artifacts/opt/composer/artifacts"options": {"follow_symlinks": true}composer.jsoncomposer.jsonrepositoriesartifact{
"repositories": [
{
"type": "artifact",
"url": "/opt/composer/artifacts"
},
{
"type": "packagist",
"url": "https://packagist.org"
}
],
"require": {
"monolog/monolog": "^2.10"
}
}composer install --repository-url=/opt/composer/artifactsrepositoryurlartifacts/*.zipcomposer.json"name"composer validatesrc/artifactsrc/composer.jsonmyvendor/mypackage/
├── composer.json
├── src/
│ └── MyClass.php
└── README.mdmyvendor/mypackage/src/myvendor-mypackage-1.2.3.zipartifactcomposer.json"version": "1.2.3""myvendor/mypackage": "^1.2""version"foo-bar-2.0.0.zip2.0.0composer installmonolog/monologpsr/logartifactcomposer.json"autoload""require"artifact"php": "^8.1"composer install -vvvReading /opt/composer/artifacts/xxx.zipDownloading https://...