离线安装失败主因是artifact包命名或结构错误:文件名须为全小写、中划线分隔的vendor-package-version.zip,且vendor/package名和version必须与composer.json中"name"和"version"字段完全一致;同时需禁用packagist.org、使用--no-cache、清空vendor和composer.lock,并确保无任何Downloading网络行为。

离线安装失败,八成是 artifact 包命名或结构不对,不是仓库配置没写对。
artifact 包文件名必须严格匹配 vendor-name-package-name-version.zip
Composer 不会解析压缩包内容来猜版本,它先按 composer.lock 里的 dist.shasum 和包名去拼文件名,再直接读取——错一个字符就报 Could not find package xxx at version yyy。
- 全部小写,中划线分隔:
monolog-monolog-2.13.0.zip(不是Monolog-Monolog、不是下划线、不能带v前缀) - vendor 和 package 名必须和
composer.json中的"name"字段完全一致(包括大小写),比如"name": "monolog/monolog"→ 文件名里就得是monolog-monolog-2.13.0.zip - 版本号必须和
composer.json中的"version"字段一致;如果 JSON 里写的是"dev-main",那 artifact 包就不该存在——artifact类型只认稳定版(^、~、具体数字) - 推荐用
composer archive --format=zip --dir=./packages/生成,它自动处理命名和内部结构;手动 zip 后改名极易出错
仓库配置必须同时禁用 packagist.org + 指向本地目录
只加一个 artifact 源没用,Composer 默认仍会 fallback 到 packagist.org 查元数据。必须显式关掉它,且确认生效位置。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在项目
composer.json顶层加两行:"repositories": [{"type": "artifact", "url": "./packages/"}]"packagist.org": false(注意键名是packagist.org,不是packagist或packagist-url) - 运行
composer config --list | grep -A2 repositories和composer config --list | grep packagist,确认输出中repositories包含你的 artifact 条目,且packagist.org显示为false - 检查全局配置是否干扰:
composer config --global repo.packagist应为空;若返回https://packagist.org,立刻执行composer config --global repo.packagist false -
url支持相对路径(如./packages/)或绝对路径(如/opt/artifacts/),但路径末尾不能带斜杠,且目录内只能放 zip/tar.gz 文件,不能嵌套子目录
离线 install 命令必须加 --no-cache 并清空旧 lock/vendor
即使包文件全在、配置全对,composer install 仍可能因缓存或 lock 文件残留远程引用而失败。
- 执行前删掉
vendor/和composer.lock(或确保 lock 是由当前 artifact 包生成的) - 运行
composer install --no-cache——--no-cache强制跳过本地缓存校验,避免 Composer 尝试从缓存里“补全”远程信息 - 如果项目曾用过
path类型本地包,lock 文件里可能含"source"字段(如"type": "git"或"url": "/home/xxx"),这种条目离线时无法解析,必须重生成 lock - 不建议在离线机上跑
composer update,它一定会触发网络请求;所有版本变更必须在联网机完成并重新导出 artifact
为什么 composer install -v 还看到 Downloading https://repo.packagist.org/packages.json
说明某处配置没生效,或者环境变量覆盖了项目配置。Composer 会合并全局、项目、环境变量三层设置,优先级容易混乱。
- 最常见原因是:项目
composer.json的repositories数组里还残留着{"type": "composer", "url": "https://packagist.org"}条目,删掉它 - 检查是否设置了
COMPOSER_REPO_PACKAGIST环境变量,它会覆盖所有配置;临时清空:unset COMPOSER_REPO_PACKAGIST -
composer install -v输出里只要出现任何Downloading开头的 URL,哪怕只是 DNS 查询,都代表网络未真正切断;此时应立即停手,回查配置 - 真正的离线行为是:全程只有
Loading composer repositories、Installing dependencies、Extracting archive,没有Downloading或Resolving远程地址
artifact 包的校验是硬性的:文件名、内部 composer.json、composer.lock 三者必须咬死一致,差一点就失败,没有 fallback 路径。别指望“差不多能用”,得像编译 C 代码一样严格对待命名和结构。

















