artifact仓库必须用绝对路径,因为相对路径在不同执行目录下解析不可控,CI或部署中易导致“Package not found”错误;Composer仅按绝对路径查找压缩包,且要求文件名严格为vendor-name-version.tar.gz、包内composer.json的name和version与之完全匹配。

artifact仓库为什么必须用绝对路径配置
离线环境下,composer config repositories.offline '{"type":"artifact","url":"/path/to/artifacts/"}' 中的 url 必须是绝对路径,否则 Composer 在解析时会尝试拼接当前工作目录,导致找不到包文件。相对路径(如 "./artifacts")在不同执行位置下行为不可控,尤其 CI 或部署脚本常切换目录。
常见错误现象:Could not find package acme/utils at version 1.2.0,但压缩包明明存在——实际是路径解析失败,Composer 没打开任何 .tar.gz 文件。
-
/opt/artifacts/这类路径最稳妥;Windows 下用C:/artifacts/(注意斜杠方向或双反斜杠) - 确保该目录对运行 Composer 的用户有读取权限,且不包含中文或空格
- 执行
ls -l /opt/artifacts/(Linux/macOS)或dir C:\artifacts(Windows)确认包文件可见
压缩包命名和内容结构不能出错
Artifact 模式下,Composer 不解压、不校验内容,只靠文件名匹配 composer.lock 中的 name 和 version 字段。一旦命名或内部结构偏差,直接跳过该包,报 Package not found。
正确命名格式:vendor-name/package-name-version.tar.gz → 实际文件名必须为 acme-utils-1.2.0.tar.gz(注意是短横线 -,不是斜杠 /)。
- 压缩包内顶层必须直接包含
composer.json,不能是acme-utils/composer.json -
composer.json中的"name"字段必须为"acme/utils","version"必须为"1.2.0",与文件名严格一致 - 推荐用
composer archive --format=tar --file=acme-utils-1.2.0.tar.gz打包,避免手动 zip 带父目录 - 检查命令:
tar -tzf acme-utils-1.2.0.tar.gz | head -n 3,第一行应为composer.json
离线机上必须禁用 packagist.org fallback
即使配置了 artifact 仓库,Composer 默认仍会尝试请求 https://repo.packagist.org/packages.json,只要项目级或全局配置里还残留 packagist 源,就会卡住或报错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
必须同时满足三件事,才算真正断网:
- 运行
composer config --global repo.packagist false(全局关掉) - 检查项目级配置:
composer config repo.packagist输出应为空,不能是composer https://packagist.org - 手动删掉项目
composer.json中"repositories"数组里所有指向https://packagist.org的条目 - 验证方式:
COMPOSER_DISABLE_NETWORK=1 composer install -v 2>&1 | grep "Downloading",不应出现任何 URL 输出
别指望 composer install 自动还原 vendor
离线部署时,很多人误以为只要把 composer.lock 和 artifact 目录拷过去,执行 composer install 就能生成 vendor。实际上,它只会解压匹配的 .tar.gz 到 vendor/,但不会重建 autoload 映射,也不会处理已存在的冲突文件。
更可靠的做法是:在联网机器上先完成完整安装,再打包整个 vendor/ 目录,离线机上跳过 install 阶段,只做校验和 autoload 刷新。
- 联网机执行:
composer install --no-dev --prefer-dist --optimize-autoloader - 打包时排除
vendor/composer/installed.json(含绝对路径,易失效) - 离线机解压后,运行:
COMPOSER_DISABLE_NETWORK=1 composer dump-autoload -o - 若 PHP 版本或扩展不一致,加
--ignore-platform-reqs,但得清楚后果——运行时报错不会提前暴露
真正的离线分发,核心不是让 Composer “学会 offline”,而是让它“根本没机会联网”。所有依赖、元数据、校验值,都得提前固化在本地文件里,少一个环节,就可能在客户现场崩掉。

















