必须将repositories写在主项目composer.json根级,且type为"path"、url为相对路径;本地包name和require须逐字匹配,version推荐"dev-main",并配置"options":{"symlink":true}以启用符号链接。

repositories 必须写在主项目 composer.json 根级
Composer 只读取当前执行命令所在项目的根 composer.json 中最外层的 repositories 字段,其他位置写的全无效。常见错误包括:把 repositories 塞进 require、autoload 或 config 里;或误写在本地包自己的 composer.json 中——这不会让主项目“看见”它。
正确写法是:
{
"repositories": [
{
"type": "path",
"url": "./packages/my-utils"
}
],
"require": {
"myorg/my-utils": "dev-main"
}
}
-
url必须是相对于该composer.json文件的路径,不能以/结尾(如"./packages/my-utils/"会静默失效) -
type必须小写"path",大小写敏感 - 改完后必须删掉
vendor/和composer.lock,再运行composer install,否则缓存可能跳过新配置
本地包 composer.json 的 name 和 version 必须严丝合缝
Composer 不检查目录是否存在,只校验本地包 composer.json 中的 name 和 version 是否匹配 require 字段。90% 的 Could not find package 错误源于此。
-
name必须和require中的包名**逐字一致**:大小写、短横线-、斜杠/全部敏感("myorg/my-utils"≠"MyOrg/MyUtils") -
version推荐显式写"dev-main"(尤其未初始化 Git 时),不要依赖分支推断 - 若用 Git 分支名作版本,本地包目录下必须有真实分支且已 commit(
git init && git add . && git commit -m "init") - 不能写
"*"、"^1.0"或"dev-main as 1.0",这些会绕过 path 源直连 Packagist
autoload 映射必须在本地包自身 composer.json 中声明
主项目的 autoload 对本地包完全无效。类能否 use 或 new,取决于本地包自己 composer.json 里的 autoload 段是否正确配置。
- 例如:
"psr-4": {"MyOrg\Utils\": "src/"}—— 注意命名空间末尾双反斜杠\,路径用正斜杠结尾"src/" - 路径是相对于本地包根目录的,不是主项目根目录(别写成
"packages/my-utils/src/") - 改完后必须在主项目中运行
composer dump-autoload,否则新映射不会写入vendor/composer/autoload_psr4.php - 若含测试类,还需在本地包中配
autoload-dev,并运行composer dump-autoload --dev
symlink 要生效得靠本地包自己的 options 配置
默认行为不是实时联动:Linux/macOS 默认 symlink,Windows 默认 fallback 到 copy。想改本地代码立刻生效,关键不在主项目,而在本地包自己的 composer.json。
- 在本地包
composer.json中加:"options": {"symlink": true} - Windows 用户必须以管理员身份运行终端,否则 symlink 创建失败且无提示
- 首次引入必须用
composer update myorg/my-utils(不是install),因为install只读composer.lock - 验证是否真链接成功:
ls -la vendor/myorg/my-utils(macOS/Linux)应看到->;dir vendormyorgmy-utils(Windows)应显示 “JUNCTION” 或 “快捷方式”
require dev-main,或者 autoload 映射路径少了一个反斜杠、多了一个空格——Composer 全部静默跳过,不报错也不提示,只默默回退到 Packagist 查找。


















