artifact仓库是Composer原生支持的离线包管理机制,它将本地ZIP/TAR文件作为正规包源,自动解压安装,不依赖网络、不查Packagist、不走Git克隆,仅按规范命名匹配版本号。

什么是artifact仓库,它为什么适合离线场景
artifact不是“下载后手动解压”,而是让 Composer 把本地 ZIP/TAR 文件当正规包源来用。它不依赖网络、不查 packagist.org、不走 Git 克隆,只按文件名匹配版本号——只要压缩包命名规范、路径正确,composer install 就能直接解压安装。
适用场景:你有一批已打包好的第三方 SDK、内部组件或定制版包(比如 vendor-name/package-name-1.2.0.zip),不想暴露源码,也不愿搭 Satis 镜像。
常见错误现象:Could not find package vendor/name in a version installable using your PHP version,其实是 ZIP 文件名没对上 lock 文件里记录的 dist.shasum 或 version,或者目录结构没按 artifact 要求组织。
- ZIP 文件必须放在
./packages/archives/这类指定路径下(不能嵌套子目录) - 文件名格式必须为
vendor-name-package-name-version.zip(注意是短横线,不是斜杠) -
composer.json中require的版本号必须和 ZIP 名字里的version完全一致(如"1.2.0"不能写成"^1.2") - 包内必须包含合法的
composer.json,且name字段要与 require 的完全匹配(大小写敏感)
配置 artifact 仓库的最小可行步骤
不用改全局配置,项目级生效即可。重点是路径、命名、锁文件三者咬合。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
假设你把所有 ZIP 放在项目根目录下的 ./packages/archives,操作如下:
- 在
composer.json顶部加"repositories"块:{"repositories": [{"type": "artifact", "url": "./packages/archives"}]} - 确保
composer.lock已存在,且其中每个包的dist.url是https://...开头的——别动它,artifact 机制会在 install 阶段自动覆盖这个 URL - 运行
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts,它会跳过远程校验,直奔./packages/archives找 ZIP - 如果报错找不到包,用
ls ./packages/archives确认 ZIP 名是否为monolog-monolog-3.5.0.zip(不是monolog/monolog-3.5.0.zip)
artifact vs path:什么时候该选哪个
二者都离线,但行为逻辑完全不同。选错会导致 autoload 失败或版本冲突。
-
path类型:适合你手头有包的完整源码(含src/、tests/、composer.json),Composer 会软链或复制整个目录,支持dev-main这类分支名,但不校验 dist.shasum -
artifact类型:只认 ZIP 文件,解压后内容必须和线上发布包一致,强制校验dist.shasum,适合交付物归档、CI 构建产物复用 - 混用风险:如果同一个包同时出现在
path和artifact仓库中,Composer 优先走path,但 lock 文件若来自 artifact 构建,就会因路径不一致导致vendor/composer/installed.json记录错误 - 私有包建议:用
path做开发,用artifact做发布;离线部署时只保留artifact配置,删掉path块防止干扰
离线执行时最容易被忽略的校验点
即使 ZIP 放对了、配置写对了,composer install 仍可能静默跳过某个包——不是失败,而是“假装装了”,结果运行时报 Class not found。
- 检查
composer.lock中该包的dist.type是否为zip(artifact 只处理zip和tar,不支持dist.type: "source") - 确认 ZIP 内的
composer.json里autoload字段路径有效(比如"psr-4": {"Monolog\": "src/"},而 ZIP 解压后确实有src/Logger.php) - PHP 版本必须 ≥ 包的
require.php声明(artifact 不绕过平台约束,COMPOSER_DISABLE_NETWORK=1也拦不住这个校验) - 运行前删掉
vendor/和vendor/composer/installed.json,避免旧缓存污染——artifact 机制只在 clean vendor 下才可靠触发

















