每个微服务必须有独立的composer.json,明确声明最小依赖集;require-dev仅限开发工具;私有共享逻辑须抽为独立包;composer.lock必须提交且禁用update。

每个微服务必须有独立的 composer.json,不能共享根级配置
微服务不是“一个大项目拆成多个目录”,而是多个独立生命周期的小项目。共用一个 composer.json 或把所有服务塞进同一仓库的顶层 vendor/,会导致依赖污染、部署不可控、升级互相牵制。
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 每个服务(如
user-service、order-service)都应在自己根目录下运行composer init或手写composer.json,明确声明自身最小依赖集 - 禁止在父目录放
composer.json并用path仓库方式加载子服务——这会模糊服务边界,CI 构建时无法单独验证某个服务的可安装性 - 服务名字段
"name"必须唯一且带命名空间前缀,例如"service/user",便于后续发布为私有包
require-dev 里只放真正开发期工具,上线必须加 --no-dev
常见错误是把 symfony/var-dumper、barryvdh/laravel-debugbar 这类调试工具写进 require,结果生产镜像里多出几十 MB 无用代码,还可能暴露 _GET 或堆栈信息。
实操建议:
-
require-dev仅限:测试框架(phpunit/phpunit)、静态分析(phpstan/phpstan)、代码规范(php-cs-fixer)、安全扫描(roave/security-advisories) - Dockerfile 中部署命令必须是
composer install --no-dev -o,-o启用优化自动加载,跳过require-dev是硬性要求,不是可选项 - CI 流程中增加检查:运行
composer show --dev确认无非预期包出现在require-dev,防止误提交
私有共享逻辑必须抽成独立包,用 repositories 引入而非复制粘贴
当多个服务都要用 JWT 解析中间件或统一日志格式器时,直接复制文件到各服务 src/ 下,等于埋下不一致的定时炸弹——某天你修了一个 bug,却漏改了三个服务中的两个。
实操建议:
- 把共享逻辑打包为私有 Composer 包,例如
shared/auth-middleware,托管在公司 Git 仓库(如 GitLab 私有项目),版本打 tag(如v1.2.0) - 在各服务的
composer.json中添加repositories块,类型设为vcs,URL 指向该仓库地址 - 依赖写法用精确版本:
"shared/auth-middleware": "1.2.0",避免^1.2导致跨服务行为漂移;升级需手动触发并回归测试
composer.lock 必须提交,且 CI/CD 只允许 install,禁用 update
不提交 composer.lock,等于让每次 composer install 变成一次随机抽奖——今天装的 slim/slim 是 4.12.3,明天可能是 4.13.0,而后者悄悄改了中间件调用顺序,线上就 500。
实操建议:
-
composer.lock和composer.json一样,是源码的一部分,必须git add并提交 - 所有 CI 流水线(GitHub Actions / GitLab CI)部署步骤只许用
composer install,严禁出现composer update—— 即使加了包名参数也不行,因为子依赖仍可能被连带更新 - 升级依赖是专项任务:由指定成员执行
composer update vendor/package-name→ 全量测试 → 提交新lock文件,不能混入日常 PR
guzzlehttp/guzzle 是合理的,但顺手加上 laravel/framework 就越界了——它暗示这个服务正在承担不该有的职责。约束力不在工具,而在每次执行 composer require 前,多问一句:“这个包解决的是本服务的领域问题,还是我在偷懒复用别人的轮子?”

















