必须先完成三件事:按职责切分子目录并消除跨包依赖;用git filter-repo导出独立git仓库;为每个子目录补全含唯一name、type:library及精准psr-4映射的composer.json。

拆分前必须完成的三件事
没做完这三步就写 composer.json,后续一定卡在类找不到或 CI 失败:
- 按业务能力或技术职责切出子目录(如
packages/auth、packages/order),确保每个目录内代码高内聚、无跨包运行时依赖(比如不能在auth里直接 newApp\Models\Order) - 为每个子目录初始化独立 Git 仓库:用
git filter-repo --subdirectory-filter packages/auth --force导出干净历史,别用拷贝;导出后当前目录只剩auth内容,所有提交路径已重写为根目录 - 每个子目录补全
composer.json:必须含全局唯一"name"(如"myorg/auth"),"type": "library","autoload"指向自身src/且命名空间与包名对齐(如"MyOrg\Auth\": "src/")
本地开发阶段用 path 仓库而非远程发布
直接发包到 Packagist 或私有源,会让业务模块因依赖框架上下文而崩——Class not found、IlluminateContractsContainerBindingResolutionException 频发。真正能跑通的开发流是本地软链接:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 主项目
composer.json的repositories加一条:{"type":"path","url":"./packages/auth"} - 子包
composer.json中autoload.psr-4必须写成"MyOrg\Auth\": "src/"(末尾不加斜杠,否则路径拼接多一个/导致文件找不到) -
require写"myorg/auth": "*",执行composer update myorg/auth后,vendor/myorg/auth会是软链接,改packages/auth/src/下任意文件,无需dump-autoload或清缓存,立即生效
模块间通信必须靠接口契约
模块之间如果出现 new AppModulesOrderService() 或调用 Auth::user() 这类硬依赖,物理隔离就失效了:
- 所有外部能力(如用户认证、通知发送)必须先定义接口(如
UserServiceInterface),放在独立抽象包(如myorg/contracts)中,禁止塞进任一业务模块 - 模块内禁止使用
Illuminate\Support\Facades\*,否则容器未注册时一跑就报绑定失败 - 模块自己的
autoload必须收敛到自身命名空间,绝不能写"App": "packages/auth/src"这种宽泛映射——它会覆盖其他模块的自动加载规则
CI/CD 和部署时最易被忽略的点
本地跑通不等于上线能用。这些细节不处理,CI 构建慢、部署失败、autoload 扫描爆炸都是常态:
- Git 历史清理必须做:用
git filter-repo后若没删掉原 Monorepo 的大文件或敏感信息,新仓库体积会异常膨胀,CI 构建变慢甚至泄露凭证 - CI 流水线中强制加
composer install --no-dev --optimize-autoloader --no-interaction,否则生产环境 autoload 性能差几倍 - 子包打 tag 必须带
v前缀(如v1.2.0),否则composer require myorg/auth:^1.2找不到稳定版本;首次发布到 Packagist 需手动 Submit Package 并验证 webhook










