内网用 Composer 的关键是禁用外网请求:需切换全局源至内网镜像、离线时用 vendor 备份+--no-scripts 安装、Satis 镜像须设 "require-all": true 递归同步依赖,并清理缓存避免校验失败。

内网环境用 Composer,核心不是“能不能装”,而是“怎么让 composer install 不去连 packagist.org”。默认配置下它一定会尝试访问外网,一旦网络不通或被防火墙拦截,就会卡在 Resolving dependencies 或直接报 Could not fetch https://repo.packagist.org/packages.json。
确认当前源是否已切换为内网镜像
很多团队部署了私有 Packagist(如 Satis、Private Packagist、Toran Proxy),但开发机或构建机仍可能残留默认源。执行以下命令验证:
composer config -g repo.packagist
如果输出是 {"type": "composer", "url": "https://repo.packagist.org"},说明全局还指向外网。必须显式切换:
- 若内网镜像地址为
https://packagist.internal,运行:composer config -g repo.packagist composer https://packagist.internal
- 若使用的是本地文件系统镜像(如通过
satis build生成的静态站点),URL 应为file:///data/packagist(注意三个斜杠) - 切勿只改项目级配置(
composer config repo.packagist ...),CI/CD 构建时通常以全局配置为准
离线安装依赖:用 composer install --no-scripts --no-plugins + vendor 备份
当内网完全无 HTTP 服务(比如 air-gapped 环境),镜像方案失效,只能靠人工同步。关键不是“怎么装 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 --no-dev --no-scripts --no-plugins --prefer-dist
(--prefer-dist强制走 zip 包,避免 git clone) - 打包整个
vendor/目录,连同composer.lock一起拷入内网;内网机器无需安装 Composer 二进制,只要 PHP 可运行即可 - 严禁在内网机器上执行
composer update或任何带网络行为的命令——即使设置了镜像,Composer 仍可能尝试访问 GitHub/GitLab 获取元数据
自建 Satis 镜像时,必须预加载所有递归依赖
Satis 默认只镜像 require 中直接声明的包,但 Composer 解析依赖时会动态请求子依赖的 composer.json。如果某个间接依赖(如 monolog/monolog 的子依赖 psr/log)没被 Satis 收录,内网 composer install 仍会失败。
解决方法是在 satis.json 中显式拉取全图:
{
"repositories": [
{"type": "composer", "url": "https://repo.packagist.org"},
{"type": "package", "package": {"name": "your/internal-package", "version": "1.0.0", "dist": {"url": "http://internal/releases/internal-1.0.0.zip"}}}
],
"require-all": true,
"archive": {"directory": "dist", "format": "zip", "skip-dev": true}
}
-
"require-all": true是关键,它让 Satis 递归解析并下载所有依赖链上的包,不只是顶层 - 构建后务必检查生成的
packages.json文件里是否包含所有用到的包名(比如搜"psr/log") - 每次上游包更新版本后,必须重新运行
php bin/satis build satis.json web/并同步到内网 Web 服务目录
最常被忽略的一点:Composer 的 cache 目录默认仍会尝试校验远程 hash,即使用了内网源。建议在内网机器上统一设置:
composer config -g cache-dir /tmp/composer-cache并定期清空,避免缓存残留外网元数据导致静默失败。

















