离线环境用composer安装依赖必须提前迁移包并配置本地源:开发联调用path仓库(需合法composer.json、name严格匹配、相对路径),纯部署用--no-network+dist缓存或satis私有镜像,严禁path进生产。

离线环境用 Composer 安装依赖,不能靠 composer install 直连 Packagist,必须提前把包“搬进来”并告诉 Composer 去哪找——核心就两条:用 path 仓库做本地开发联调,或用 dist 缓存 + --no-network 做纯离线部署。
path 仓库只适合本地开发,千万别进生产环境
你在 composer.json 里加了 "type": "path",是为了改一个本地包、立刻看到效果。但这个配置一旦跑到服务器上,composer install 就会报 Could not find package xxx,不是因为网络问题,而是路径根本不存在,Composer 不 fallback,直接失败。
-
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显式隔离
离线部署必须用 --no-network + dist 缓存
真离线(比如客户内网、航天测控站)不能靠 path,得把 ZIP 包提前下好、校验好、放好位置,再让 Composer 只认本地缓存。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 联网机上先确保有
composer.lock,然后运行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,它会跳过网络请求,只从缓存读 ZIP 并校验shasum - 如果
composer.lock里某包的dist.shasum和缓存中 ZIP 的实际哈希不一致,安装会中断——所以联网机打包和离线机还原必须用同一份 lock
用 Satis 搭私有镜像比手动搬包更可靠
项目依赖多、版本杂、还要长期维护时,手动同步 files/ 容易漏、难验证。Satis 是 Composer 官方工具,能生成静态 packages.json + 所有 ZIP,本质是个可部署的离线源。
- 在联网服务器上写
satis.json,列出需要的包名和版本约束(支持"require-all": true抓全部依赖) - 运行
php bin/satis build satis.json web/,输出web/packages.json和web/dist/下所有 ZIP - 把整个
web/目录扔进内网 Web 服务(Nginx/Apache),离线项目只需在composer.json加一条仓库:{"type": "composer", "url": "http://intranet/satis/"} - Satis 构建结果不含任何动态逻辑,适合审计、备份、灰度发布;但注意它不处理
path类型仓库,只抓远程可发布的包
最难的不是让包装进去,而是确保 vendor/composer/installed.json 里每个包的 "source" 字段在开发机和生产机上真正一致——本地是 "type": "path",线上必须是 "type": "package" 或 "type": "vcs",差一点,行为就可能错位。










