composer.lock是应用项目部署的强制契约文件,必须提交至Git,记录精确版本、SHA256校验值与完整依赖树,确保开发、CI、生产环境vendor目录字节级一致;缺失或跳过将导致构建不可重现、类找不到及安全扫描失效。

dev-分支不能当版本用,commit hash才是唯一锚点
写dev-main不是锁定,是放任每次composer update拉最新 HEAD。CI 构建时如果上游main被 force push,composer install会直接失败,报Could not find package vendor/package at version dev-main——因为锁进composer.lock的 commit hash 已不存在。
真正可落地的写法只有:"vendor/package": "dev-main#abc1234"。注意三点:
- hash 必须是完整 40 位(或至少前 7 位),且对应远程分支当前 HEAD
- 含斜杠分支如
feature/login要写成dev-feature%2Flogin#def5678,URL 编码不能省 - 该写法会让 Composer 当作 dist 包处理,跳过 git clone,直接下载 zip,也规避了 SSH key 权限问题
flock 不是可选,而是并发 CI job 的强制门槛
多个 CI job 同时跑composer install,哪怕都读同一份composer.lock,也会因无文件锁导致vendor/写入错乱:一个 job 装了symfony/console,另一个漏装;或部分包解压一半被中断,下次 install 却不重试。
flock必须锁composer.lock本身,且命令要写对:
- ✅ 正确:
flock ./composer.lock -c 'composer install --no-interaction' - ❌ 错误:
composer install | flock ./composer.lock(锁在 pipe 上,无效) - ❌ 错误:
flock ./composer.json -c 'composer install'(composer.json不参与 install 写入逻辑)
Windows CI 环境无法用flock,得改用 PowerShell 的Get-FileLock或进程级互斥量,否则并发风险照旧。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
CI 中禁用 composer update,只允许 install + lock 校验
composer update会重写composer.lock,且不校验当前文件是否已被他人修改。两个 job 并发跑update,等于同时重画依赖地图——结果必然是哈希错乱、packages数组顺序颠倒、甚至丢掉某些 require-dev 包。
CI 脚本里必须堵死这个入口:
- 第一步检查
composer.lock是否存在且属于当前 commit:git log -1 --format=%H -- composer.lock - 第二步启用
"config": {"lock": true},让composer install在composer.json与composer.lock不匹配时立刻报错 - 第三步禁止任何
COMPOSER_NO_INTERACTION=0或交互式调用,避免意外触发 update 流程
staging 环境别混用 --no-dev,用独立 composer-staging.json 更可控
staging 常需要部分 dev 工具(比如健康检查用的symfony/console),但又不能像 dev 环境那样装全量require-dev。硬塞进require-dev再靠环境变量开关,容易导致autoload-dev映射缺失,运行时报Class not found。
更稳的做法是维护一份composer-staging.json:
- 它和
composer.json结构一致,但require-dev只放 staging 真正需要的包 - CI 中用
COMPOSER=composer-staging.json composer install显式指定 - 对应生成专属
composer-staging.lock并提交,避免和 prod/dev 的 lock 文件互相污染
所有环境的composer.lock必须提交,且不能被.gitignore过滤——这是整个策略能成立的前提,不是技术细节,是协作契约。

















