离线安装composer包的核心是用path或artifact仓库让composer从本地读取:path需在composer.json声明本地目录路径且包含合法composer.json,再执行require指定匹配版本;artifact则需规范命名zip包并配置本地artifact仓库路径。

composer 没有“下载 zip 后直接 install”的离线模式,所谓离线安装,本质是让 composer 从你本地磁盘读取包——不是靠网络,而是靠路径声明 + 合法元数据。只要满足这两个条件,它就能工作,哪怕断网、没 Packagist、没 Git。
怎么用 path 仓库装本地目录里的包
这是最常用、最轻量的离线方案,适合调试私有组件或无网环境构建。
- 本地包根目录下必须有
composer.json,且含"name"(如"acme/utils")和"version"或开发分支标识(如"dev-main") - 项目根目录的
composer.json中添加repositories块,"type": "path","url"写绝对路径(Windows 要带盘符,如C:/projects/my-pkg;macOS/Linux 用/Users/xxx/pkg) - 执行
composer require acme/utils:dev-main(版本号必须和本地包composer.json里的一致,不能写*或^1.0) - 安装后
vendor/acme/utils是个符号链接(Linux/macOS)或完整复制(Windows),不是静态副本——改本地代码,require的类立刻生效
为什么 require 本地包总报 Could not find package
这不是网络问题,是元数据或路径没对上。常见断点:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
repositories没写在项目根composer.json里,而是误加到了本地包自己的composer.json中 - 本地包目录下没有
composer.json,或name字段拼错(比如少写了 vendor 段,或大小写不一致) -
url用了相对路径(./packages/mylib),path类型只认绝对路径 - 本地包没初始化 Git(
git init && git add . && git commit -m "init"),某些 Composer 版本会拒绝加载未 commit 的目录
怎么批量装多个本地包(比如 ./packages/ 下一堆)
别试图写 N 条 repositories,用通配符一条搞定:
- 确保每个子目录(如
./packages/my-utils、./packages/api-client)都有合法composer.json - 在项目
composer.json的repositories中写:{"type":"path","url":"./packages/*"} -
require时仍按正常方式写包名和版本,例如:"acme/my-utils": "^1.0"、"acme/api-client": "dev-main" - 注意:
*只匹配一级子目录,不支持**递归;路径必须可被当前用户读取,权限不足会静默失败
artifact 仓库:适合团队分发预打包的 zip
当你要把一堆已打好包的 zip(比如 CI 构建产物)离线共享给多人,artifact 比 path 更合适:
- 所有 zip 必须命名规范:
vendor-name-package-version.zip(如acme-utils-1.2.3.zip) - zip 解压后顶层必须直接是
composer.json、src/等,不能套一层文件夹 - 在项目
composer.json中配置:{"type":"artifact","url":"/path/to/your/zips"} - 然后照常
composer require acme/utils:^1.2,Composer 会自动扫描 zip 并匹配版本 - 和
path不同,artifact安装的是解压后的静态副本,不会 symlink,也不依赖 Git
composer update 都可能触发远程源回退——如果你的 repositories 配置没放在项目级 composer.json 里,或者 minimum-stability 和 prefer-stable 设置冲突,composer 会悄悄去 Packagist 查,然后失败。断网环境下务必确认配置完全隔离。










