断网时可用path仓库本地安装包,但须严格满足五点:repositories写在项目composer.json根级;url为合法相对目录路径(不带末尾/);本地包含合法composer.json且name与require逐字一致;require必须显式指定dev-main等版本;启用symlink并运行dump-autoload。

断网时 Composer 无法访问 Packagist,但只要包代码在本地磁盘上,就能用 path 类型仓库绕过网络依赖——前提是路径、name、version 三者严丝合缝,否则 Composer 会静默跳过,连错误都不报。
repositories 必须写在项目 composer.json 根级
Composer 只读取项目根目录下 composer.json 最外层的 repositories 字段,其他位置全无效:
- 不能塞进
require、autoload、config或extra里 - 不能写成
"repositories": {"my-pkg": {...}}(必须是数组) - 正确结构是:
{ "repositories": [ { "type": "path", "url": "./packages/my-utils" } ], "require": { "myorg/utils": "dev-main" } }
url 必须是合法相对路径,且指向含 composer.json 的目录
url 不是文件路径,而是目录路径;它必须从主项目 composer.json 所在位置出发计算:
- ✅
"url": "./packages/utils"(推荐,清晰可读) - ✅
"url": "../my-pkg"(末尾不能带/,否则整个仓库被跳过) - ❌
"url": "packages/utils"(缺./前缀,静默忽略) - ❌
"url": "/home/user/pkg"(绝对路径,不解析) - ❌
"url": "../my-pkg/"(末尾斜杠导致跳过)
该目录下必须存在语法合法的 composer.json,且至少含 "name" 字段;可用 composer validate 检查。
本地包的 name 和 version 必须与 require 完全一致
Composer 不做大小写转换、不补短横线、不忽略下划线——匹配是逐字节的:
-
"name": "myorg/utils"→ require 时必须写myorg/utils,不是MyOrg/Utils或myorg_utils - 未初始化 Git 时,
"version": "dev-main"最稳;写"^1.0"或*会找不到 - 若用
dev-main,本地包目录下必须有 Git 仓库(至少git init && git add . && git commit -m "init") - 执行命令时必须显式带版本:
composer require myorg/utils:dev-main,不能省略
类找不到?autoload 和 symlink 是两个独立关卡
装进 vendor/ ≠ 能 use。90% 的 Class not found 错误出在这两步:
-
autoload 映射没生效:本地包
composer.json中必须声明"psr-4": {"MyOrg\Utils\": "src/"}(注意命名空间末尾反斜杠、路径末尾斜杠、大小写完全一致),然后在主项目中运行composer dump-autoload -
改了代码不生效:默认是复制模式。要热更新,必须在本地包自己的
composer.json中加"options": {"symlink": true};Windows 用户需管理员权限运行终端;且必须用composer update myorg/utils(install不建链接)
验证 symlink 是否成功:ls -la vendor/myorg/utils(Linux/macOS)应看到 -> 箭头;Windows 上 dir vendormyorgutils 应显示“JUNCTION”或“符号链接”字样。路径对、name 对、version 对、autoload 对、symlink 对——这五点少一个,断网安装就卡在某个静默失败环节。


















