离线镜像必须包含packages.json和所有zip包,且zip名须为vendor-name-version.zip;仅复制vendor目录无法支持require/update。需用satis或packagist-mirror导出完整镜像,配置composer类型源读packages.json、artifact类型源读zip,并设composer_disable_network=1禁用网络。

离线镜像必须包含 packages.json + 所有 ZIP 包
单纯复制 vendor/ 只能解决已有依赖的部署,但无法支持后续 composer require 或 update。真要“在断网环境里当 Packagist 用”,就得导出完整镜像:不是只拷几个 ZIP,而是把 packages.json(元数据索引)和所有包的 .zip 文件(dist 归档)一并打包。
常见错误是只导出 ZIP 却漏了 packages.json——这时 Composer 会报 Could not fetch packages.json,哪怕 ZIP 全在本地也读不到,因为它根本不知道该装哪个版本。
-
packages.json必须放在镜像根目录,内容需覆盖全部直接/间接依赖(比如你没 requirepsr/log,但monolog/monolog依赖它,这个包的元数据也得存在) - ZIP 文件名必须严格为
vendor-name-package-name-version.zip(如monolog-monolog-3.5.0.zip),不能带下划线或斜杠 - 推荐用
packagist-mirror工具导出,比手写脚本更可靠;若手动构造,务必用composer archive验证 ZIP 内容与composer.lock中的dist.shasum一致
导入时必须禁用网络并显式配置本地源
即使镜像文件全拷进内网,composer install 默认仍会去 https://repo.packagist.org 拉元数据——这不是 bug,是设计行为。必须通过 repositories 显式覆盖默认源,并配合环境变量切断联网路径。
关键点在于:artifact 类型只读 ZIP,不提供元数据;而 composer 类型源才读 packages.json。二者得组合用,不能只配一个。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目
composer.json顶部加:{"repositories": [{"type": "composer", "url": "https://your-local-mirror"}, {"type": "artifact", "url": "./packages/archives"}]} - 执行前设环境变量:
COMPOSER_DISABLE_NETWORK=1,否则插件(如symfony/flex)可能绕过配置偷偷联网 - 删掉全局配置里的干扰项:
composer config -g --unset repo.packagist和composer config -g --unset http-proxy - 验证是否生效:加
-v运行composer install,输出中应出现Reading packages.json from https://your-local-mirror/packages.json,而非Downloading https://repo.packagist.org/...
镜像服务本身可以不用 HTTP 服务器
很多人以为“镜像”就得搭 Nginx 或 Apache,其实大可不必。Composer 支持 file:// 协议读取本地 JSON 和 ZIP,只要路径可访问、权限正确,就能跑通。
适合临时应急或单机部署,避免引入额外服务依赖和端口冲突问题。
- 把镜像目录(含
packages.json和archives/子目录)放到项目同级,比如./packagist-mirror/ -
composer.json中写:{"repositories": [{"type": "composer", "url": "file:///full/path/to/packagist-mirror"}, {"type": "artifact", "url": "./packagist-mirror/archives"}]} - 注意 Linux 下
file://必须是绝对路径,Windows 要用file:///C:/path/格式;路径中不能有空格或中文 - 测试命令:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts -v
最常被忽略的校验环节:installed.json 与平台约束
镜像导出后,很多人直接扔进内网就跑,结果 composer install 成功却运行时报 Class not found。问题往往不在 ZIP 或 JSON,而在 vendor/composer/installed.json 的生成逻辑或平台约束未对齐。
installed.json 是 Composer 运行时加载包的依据,它由 composer install 在本地生成,不随镜像导出——所以即使 ZIP 和 packages.json 完整,第一次离线安装仍需成功执行一次 install 来产出它。
- 目标机 PHP 版本(含小版本)、扩展(
ext-zip、ext-openssl、ext-mbstring)必须和导出镜像时的环境完全一致 - 检查
composer.lock中的platform字段,比如"php": "8.2.12",目标机php -v输出必须精确匹配 - 首次在内网执行
composer install后,立刻验证vendor/autoload.php是否可正常require,并确认vendor/composer/installed.json已生成且不为空 - 如果目标机是容器或精简系统,确保
/tmp可写——Composer 解压 ZIP 时需要临时空间,否则静默失败










