真正锁定依赖靠的是composer.lock+dist缓存+--no-network三者咬合;path仓库会绕过lock校验,每次install都读本地composer.json,导致“悄悄升级”,仅适用于单机联调,离线部署必须禁用path、启用缓存校验。

本地包配置本身不解决依赖锁定,反而容易破坏 composer.lock 的一致性——真正要锁定的,是 dist 包的 shasum 和完整路径,不是本地文件系统里的任意目录。
path 仓库会绕过 lock 文件校验
当你在 repositories 中添加 "type": "path",Composer 完全忽略 composer.lock 里记录的 dist 信息,直接读取本地目录下的 composer.json 并解析其 name、version 和 autoload。这意味着:
- 每次
composer install都重新读取本地文件,哪怕composer.lock里写的是"1.2.3",只要本地composer.json改成"1.2.4",就会装上新版本 -
composer update不会更新这个包(因为没远程源),但composer install仍可能因本地内容变更而“悄悄升级” - CI/CD 构建失败常见原因:开发机有该 path 目录,离线构建机没有,报
Could not find package xxx,且不 fallback
想锁定本地包,必须用 dist 缓存 + --no-network
真离线环境或需要强锁定时,唯一可靠路径是把 ZIP 包放进 Composer 缓存,并让安装过程跳过网络。关键不在“本地目录”,而在“缓存命中”:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 联网机执行:
composer install --prefer-dist --no-scripts --no-plugins,确保所有包以 ZIP 形式下载并存入~/.composer/cache/files/ - 复制整个
files/目录到离线机固定路径(如/opt/composer-cache) - 离线机运行:
composer config --global cache-dir /opt/composer-cache,再执行composer install --no-network --prefer-dist - Composer 会逐个比对
composer.lock中每个包的dist.shasum和缓存中 ZIP 的实际 hash,不匹配则报错,不会降级或跳过
开发联调时怎么安全用 path 仓库
path 仓库只适合单机开发联调,目标是“改完立刻生效”,但必须主动隔离,避免污染交付物:
-
repositories中的url必须是相对路径(如./packages/my-utils),Windows 要带盘符(如C:/dev/my-utils) - 目标目录下必须有合法
composer.json,且"name"字段必须和require中声明的完全一致(如"acme/utils") - 默认是复制行为;要实时生效得加
"options": {"symlink": true},Windows 需管理员权限或开启开发者模式 - 上线前必须从
composer.json中彻底删除repositories块,CI 脚本建议用COMPOSER=composer.prod.json composer install显式切换配置
很多人以为把包放本地就能“锁定”,其实恰恰相反:path 是最不锁定的方案。真正的锁定靠的是 composer.lock + dist 缓存 + --no-network 三者咬合,缺一不可。任何试图用 path 替代 dist 缓存的离线部署,最终都会在某个环境里爆出来。










