离线安装必须禁用 packagist.org,执行 composer config --global repo.packagist false 并清除项目级 packagist 配置;artifact 类型实现零网络安装,要求压缩包命名、内容、目录结构严格匹配;path 类型用于本地联调,需用相对路径、显式设 "symlink": false、require 带 @dev,并正确配置 autoload-dev 与命名空间。

离线安装必须禁用 packagist.org,否则一定连网
哪怕你已经加了 artifact 或 path 仓库,只要 repo.packagist 没彻底关掉,composer install 就会尝试向 https://packagist.org 发起 DNS 查询甚至 HTTP 请求。这不是“可能”,而是 Composer 2.5+ 的默认 fallback 行为。
必须执行两步:
-
composer config --global repo.packagist false(全局关掉) -
composer config repo.packagist在项目根目录下运行,确认输出为空;如果显示composer https://packagist.org,说明项目级配置里还残留着旧源,要手动删掉composer.json中repositories数组里指向 packagist 的条目
验证是否生效:跑一次 composer install -v,全程不应出现 Downloading https://repo.packagist.org/ 或任何含 packagist.org 的日志行。
用 artifact 类型实现纯离线安装(适合打包部署)
artifact 是唯一真正“零网络”的类型——它只读本地 .tar.gz 文件,不校验远程、不查元数据、不发任何请求。
关键约束很硬,错一个就失败:
- 压缩包命名必须是
vendor-name/package-name-version.tar.gz,例如monolog/monolog-2.13.0.tar.gz - 包内
composer.json的name和version必须与文件名完全一致(大小写、分隔符都不能差) - 所有
.tar.gz放进同一个平级目录,比如/opt/artifacts/,不能有子目录嵌套 - 配置命令是:
composer config repositories.offline '{"type":"artifact","url":"/opt/artifacts/"}'
注意:composer.lock 中的 dist.shasum 会被用来查找对应文件,校验失败直接报错,不会 fallback。
用 path 类型做本地联调(适合边写边测)
path 类型跳过所有网络交互,直接加载本地目录里的 composer.json,但仅适用于你手头已有完整源码的包。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
常见翻车点:
- 路径必须是相对路径,比如
./packages/my-utils;绝对路径如/home/user/my-utils在 CI 或他人机器上必然失效 -
composer.json中必须显式写"options": {"symlink": false},否则离线环境软链会断 -
require时必须带@dev,例如composer require my-utils/my-utils:@dev;不加就匹配不到本地路径 - 包的
name字段(如"my-utils/my-utils")必须和require写的一模一样,包括大小写
改完 composer.json 后,别只跑 composer install,建议补一句 composer dump-autoload,确保 autoloader 映射及时更新。
测试类找不到?autoload-dev 配置漏了或没生效
本地联调时,常遇到 Class not found 报错,但其实不是路径问题,而是测试类根本没进 autoloader。
必须用 autoload-dev,不能用 autoload:
-
autoload-dev只在composer install --no-dev以外的场景生效,且不会打进生产包 - psr-4 规则要严格配对,例如
"Tests\": "tests/"—— 注意结尾双反斜杠,少一个就是非法命名空间 - 测试文件
tests/Feature/AuthTest.php对应的类必须声明namespace TestsFeature; - 改完后必须运行
composer dump-autoload;CI 环境中尤其不能依赖composer install自动触发
验证是否加载成功:composer show -s | grep Tests,能看到映射行才算到位。
离线配置最麻烦的不是步骤多,而是每个环节都拒绝“差不多”——命名、路径、斜杠、大小写、@dev、symlink: false、repo.packagist false,缺一不可。一旦出错,Composer 不报明确错误,只静默回退到网络源或抛出模糊异常,得靠 -v 日志逐行盯请求地址才能定位。

















