Composer 默认不支持 Monorepo,需在根 composer.json 中通过 repositories.path 显式声明子包路径,并在 require 中按唯一 name 引入;子包 name 必须匹配且符合 vendor/name 格式,version 设为 dev-main 才能通过软链接实时生效。

Composer 本身不支持 Monorepo 模式,直接 composer install 会报错找不到根包或依赖解析失败——因为默认只认单个 composer.json,且不识别子目录下的包声明。
为什么 vendor 目录里看不到你的本地包?
Composer 默认只从 Packagist 或配置的仓库拉取远程包。即使你在 monorepo 根目录下放了多个含 composer.json 的子包(如 packages/foo 和 packages/bar),它也不会自动发现并软链接它们。
- 根本原因:Composer 的
repositories配置未启用path类型,或路径没写对 -
path仓库必须显式声明,并且路径需为相对于根composer.json的相对路径(不能用../或绝对路径) - 子包的
name字段必须唯一、符合vendor/name格式,且不能与 Packagist 上已存在包重名
如何让主项目正确引用本地子包?
在 monorepo 根目录的 composer.json 中,通过 repositories + path 声明子包位置,并在 require 中按 name 引入。
{
"name": "myorg/monorepo",
"type": "project",
"repositories": [
{
"type": "path",
"url": "packages/foo"
},
{
"type": "path",
"url": "packages/bar"
}
],
"require": {
"myorg/foo": "*",
"myorg/bar": "*"
}
}
-
"myorg/foo"必须和packages/foo/composer.json中的"name"完全一致 -
"*"版本约束会匹配dev-main、dev-develop等分支名(前提是子包有"version": "dev-main"或使用composer link工具) - 运行
composer update myorg/foo会创建符号链接(Linux/macOS)或复制(Windows),而非下载 ZIP
开发时如何避免反复 composer update?
每次改子包代码都要 composer update 太慢,且容易漏掉更新。推荐用 composer link(来自 composer-plugin-link)或原生 path + symlink 模式。
EnableCE与众多学术会议管理系统的最大不同,是把会议与论文投稿分离成两个不同的管理对象,这两个对象既可分离自成体系,又可在两者之间建立关联关系,形成统一整体。依据这样的管理理念,EnableCE它可以帮助您轻松管理以下四类会议或活动:学术性会议:参会人员须先提交作者名单中包含其姓名的论文稿件,在稿件被专家审核通过的前提下,方允许其进行会议的注册报名一般性会议:会议不进行论文征文,参会人员可直
- 确保子包
composer.json中设"version": "dev-main"(或对应分支名) - 执行
composer require myorg/foo:dev-main --no-update,再composer update myorg/foo,首次会建立软链 - 后续修改子包源码无需重新 install/update —— 软链指向实时生效(只要没删
vendor/myorg/foo) - 注意:Windows 默认禁用符号链接,需以管理员身份运行终端或启用开发者模式
CI/CD 构建时如何处理 path 仓库?
CI 环境中 path 仓库仍有效,但必须保证子包目录结构完整;若 CI 只 checkout 单个子包目录,则 path 查找失败。
- CI 脚本开头加
ls -la packages/确认子包存在 - 不要在
.gitignore中忽略packages/*/vendor,否则composer install在子包内单独运行会失败 - 发布前用
composer validate --no-check-publish验证所有子包composer.json格式合法 - 真正发版时,子包应单独
git tag v1.0.0并推送到 Packagist,此时要移除repositories,改用packagist.org
最易被忽略的是子包 autoload 配置是否覆盖全部源码路径,以及 path 仓库在 Windows 下的权限问题——很多“本地包不生效”其实卡在这两步。









