离线环境必须提前生成并校验composer.lock,因其是install唯一依赖源;缺失、损坏或dist信息不全(如缺sha256/url)将直接导致安装失败,常见报错包括无法获取repo.packagist.org及包不可用。

离线环境必须提前生成并校验 composer.lock
离线环境无法访问 Packagist 或任何远程仓库,composer install 唯一能依赖的就是本地存在的 composer.lock 文件。如果该文件缺失、损坏或未包含所有必需包的完整 dist 信息(比如 dist.sha256、dist.url),安装会直接失败。
常见错误现象:
-
Could not fetch https://repo.packagist.org/...—— 即使加了--no-interaction也拦不住,因为 Composer 在解析 lock 文件时仍尝试验证远程元数据 -
Package vendor/package is not available in the configured repositories—— lock 文件里记录的是 dist URL,但离线机上没提前缓存对应 zip 包,且没配本地 artifact repo
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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-dev,确保composer.lock中每个包都有dist字段(含sha256和url) - 用
composer archive vendor/package --format=zip手动导出关键包的 zip,或运行composer install --prefer-dist --no-dev --no-progress后打包整个vendor/目录(仅作备用) - 离线前执行
composer install --dry-run,确认无网络请求发出;再跑一次composer install --verbose观察是否跳过所有 “Downloading” 日志
部署命令必须禁用所有网络行为
默认的 composer install 在读取 composer.lock 时仍可能触发平台检查、安全审计或 repo 元数据刷新 —— 这些都会连网。离线环境必须显式切断所有潜在出口。
实操建议:
- 固定使用:
composer install --no-dev --no-interaction --no-progress --optimize-autoloader --ignore-platform-reqs - 务必加上
--ignore-platform-reqs:避免因 PHP 版本、扩展缺失等触发远程 fallback 检查(某些旧版 Composer 会在平台不满足时尝试查 Packagist 获取兼容替代) - 禁止使用
composer update或任何带--with-dependencies的命令:它们必然触发 SAT 求解器联网查可用版本 - CI 流水线中可在离线前加一步:
composer install --locked --dry-run,验证 lock 文件是否仍满足composer.json约束,失败则阻断发布
如何让 composer.lock 在离线时真正“自包含”
composer.lock 默认只存 dist URL,不存实际 zip 内容。离线时若 URL 不可达(比如指向 packagist.org),即使有 SHA256 也没用。要让它真正离线可用,得让它“带货”。
实操建议:
- 启用
artifact模式:在联网机上配置composer config --global repo.packagist artifact:/path/to/zips,然后把所有依赖包 zip 放进该目录,再运行composer update --lock—— 此时composer.lock会记录本地路径而非远程 URL - 或者改用
composer install --prefer-source并提前git clone所有依赖到本地目录,再用pathrepository 指向它们(适合少量私有包) - 检查 lock 文件是否已“脱网”:打开
composer.lock,搜索"url",确认所有值都是file:///或绝对路径,而非https://
离线 CI 流程里最容易漏掉的校验点
很多团队以为只要 composer.lock 提交了、部署用 install 就万事大吉。但离线 CI 最常崩在“锁文件看起来对,其实缺东西”。
容易被忽略的地方:
-
platform配置没同步:如果composer.json里写了"platform": {"php": "8.2.10"},但离线机是 PHP 8.2.5,旧版 Composer 可能静默降级依赖,新版则报错 —— 必须确保platform与目标环境完全一致 -
conflict条目在 lock 里不生效:它只影响下次update,离线install时完全无视 —— 所以冲突必须在生成 lock 前就解决干净 - 没验证
vendor/是否真能加载:离线部署后,应立刻跑php -d extension=json.so -d extension=mbstring.so -r "require 'vendor/autoload.php';",防止因扩展缺失导致 autoloader 失败










