内网可用,但需配置内网镜像源并确保元数据、证书、dns、端口和协议正确;默认连 packagist.org 会失败,必须通过 composer config -g repo.packagist composer https://your-intranet-mirror.com 全局替换,且验证输出为含 type 和 https url 的对象。

内网搭 Packagist 镜像不是“配个 URL 就行”,核心是让 composer install 完全不发外网请求,且能正确解析私有包 + 公共包的混合依赖。失败大多卡在元数据不可用、签名校验失败或源配置被忽略这三个环节。
确认 composer 是否真走内网源
很多人改了配置却没生效,因为 Composer 会静默 fallback 到官方源。验证必须用命令直查:
- 运行
composer config -g repo.packagist,输出必须是类似{"type": "composer", "url": "https://packagist.internal"}—— 注意键名是repo.packagist(不是repos.packagist),type字段不能丢,URL 必须带https://和末尾斜杠 - 如果输出为空或报错,说明全局配置根本没写入;常见原因是 PHP 禁用了
proc_open或putenv,需检查php.ini并重启 PHP 服务 - CI/CD 构建机常以
www或runner用户运行,-g写的是 root 配置,得换用户执行或改用环境变量:COMPOSER_REPO_PACKAGIST=https://packagist.internal
Satis 构建静态镜像时必设的三个字段
Satis 不是代理服务,它生成静态文件,配置稍错就导致 composer install 找不到包或无法下载 dist 包。关键字段不能省:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"require-all": true—— 否则只同步composer.json里显式 require 的包,私有仓库里的其他版本、dev 分支、tag 都不会进索引 -
"archive"块必须完整:{"directory": "dist", "format": "zip", "skip-dev": true}—— 缺archive导致 CI 构建时拉不到 zip 包,只能 clone git,而内网往往禁用 git 协议 -
"repositories"必须是对象数组,每个私有包要单独声明类型:{"type": "vcs", "url": "https://gitlab.internal/internal-sdk"}或{"type": "package", ...}—— 写成字符串 URL 或漏掉type,Satis 构建时直接跳过该仓库
私有包拉不到?先看 composer.json 里有没有注册仓库
即使 Satis 已同步了 internal/sdk,客户端仍可能报 Could not find package internal/sdk,原因不是镜像没同步,而是 Composer 根本没去查它:
- 项目
composer.json的repositories字段必须包含内网源,且key得叫packagist(不是internal或其他别名),否则 Composer 不认这是主源 - 若同时用了阿里云镜像和内网镜像,顺序很重要:
"repositories"数组里内网源必须排第一,否则 Composer 先去阿里云查,查不到才 fallback,但默认不 fallback(除非你开了packagist.org作 secondary) - 私有包版本号必须匹配:Satis 构建后,
packages.json里只存它实际生成的版本(如1.2.0),如果你require的是dev-main,又没在satis.json里设"archive": {"skip-dev": false},就必然失败
HTTPS 证书和 DNS 是最常被跳过的底层问题
镜像服务本身跑通了,composer install 还卡在 Resolving dependencies 或报 Curl error,大概率是网络层干扰:
- 内网镜像用自签名证书?加
composer config -g secure-http false(仅限可信内网),否则 Composer 直接拒绝连接 - DNS 解析慢或失败?在
/etc/hosts里硬写192.168.10.5 packagist.internal,绕过 DNS 查询 - 残留代理配置?运行
composer config -g --unset http-proxy和--unset https-proxy,旧代理会劫持所有 HTTPS 请求并导致空响应 - 用
composer install -v看真实请求地址——如果日志里出现https://repo.packagist.org,说明源配置完全没生效,别调镜像服务,先查配置
真正难的不是搭起一个能返回 packages.json 的服务,而是让每个开发机、每台 CI 构建机、每个 Docker 容器都严格按预期路径查源、校验、下载。Satis 的静态特性决定了它不自动感知代码变更,每次私有包更新后,必须手动触发 php bin/satis build,这个动作容易被遗忘,结果就是“明明推了新版本,别人还是装不到”。










