脱机环境用composer不是不能用,而是必须提前将依赖包和元数据本地化;因composer install默认需联网验证元数据、获取下载url,离线时会卡在远程请求环节,典型错误如“could not fetch https://packagist.org/packages.json”。

脱机环境用 Composer 不是“不能用”,而是必须提前把依赖包和元数据都带进去,否则 composer install 会直接失败——因为默认行为是联网读取 packagist.org 或私有仓库的包信息。
为什么 composer install 在没网时会报错
即使项目已有 composer.lock,composer install 仍需访问仓库(如 Packagist)验证包元数据、检查签名、获取下载 URL。脱机时会卡在 Reading composer.json 后的远程请求环节,典型错误是:
Failed to decode response: file_get_contents(): php_network_getaddresses: getaddrinfo failed: Name or service not known
或更直白的:Could not fetch https://packagist.org/packages.json
根本原因:Composer 默认不缓存远程仓库索引,每次 install/update 都要联网拉取最新包列表。
离线可用的两种可靠方案
核心思路:把远程仓库的“镜像”本地化。不是只拷 vendor,而是把包源 + 元数据一起搬进来。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 方案一(推荐):用
composer archive打包整个依赖树(含vendor/和composer.lock),在目标机器上直接解压 +composer install --no-scripts --no-plugins强制跳过联网校验 - 方案二(更彻底):搭建本地 Packagist 镜像(如
satis或toran proxy),提前把所需包全部镜像到内网服务器,再配置composer.json的repositories指向本地地址
注意:composer dump-autoload 可以离线运行,但前提是 vendor/autoload.php 已存在;而 composer update 在脱机环境下基本不可用,除非你已手动维护好本地仓库索引。
composer.json 中必须改的配置项
若走本地仓库方案,repositories 字段是关键。示例:
{
"repositories": [
{
"type": "composer",
"url": "http://192.168.1.100/satis/"
}
],
"require": {
"monolog/monolog": "^2.10"
}
}
重点:
- 必须把默认的
packagist.org禁掉,否则 Composer 仍会尝试回源:加"packagist.org": false到repositories顶层 -
url必须是可被目标机器 HTTP 访问的地址,不能是file://协议(Composer 不支持本地文件协议作为仓库) - 本地仓库服务(如 Satis)生成的
packages.json必须包含完整元数据,否则install会因找不到版本信息失败
容易忽略的坑:自动加载和脚本执行
脱机后 vendor/autoload.php 虽然能用,但要注意:
- 如果依赖包里有
autoload-dev或classmap生成逻辑,且未提前运行过composer dump-autoload,脱机时无法重新生成 -
scripts里调用了远程命令(比如php-cs-fixer自动更新规则)会失败,建议在脱机前用--no-scripts安装,并确认业务代码不依赖这些脚本产出物 - 某些包(如 Laravel 的
laravel/framework)在安装时会触发post-install-cmd下载额外资源(如前端 assets),这类操作必须提前完成或禁用
最稳妥的做法:所有构建动作(install、dump-autoload、assets publish)都在有网环境中完成,脱机机器只负责部署和运行。










