企业级 Composer 私有包分发不推荐自建镜像站,应优先用 Satis 生成静态仓库;Satis 扫描 VCS 仓库、打包 tag 为 ZIP、生成 packages.json 等静态文件,由 Web 服务器托管,绕过 OAuth 和限流问题,无需 PHP 环境。

企业级 Composer 私有包分发不推荐自建“镜像站”,而应优先用 Satis 生成静态包仓库;若硬要镜像 Packagist.org 官方源,必须搭配反向代理 + 缓存策略 + token 鉴权,否则 composer install 会随机失败。
为什么不能直接用 composer config -g repo.packagist 指向私有地址
这个命令只改写元数据入口(packages.json),不接管 ZIP 包实际分发。你配置了 https://my-internal-mirror.com/,但 Composer 仍会从原始包的 dist.url(比如 GitHub Releases)拉 ZIP——而这些地址不受你控制,极易触发 403、rate limit 或 CDN 路由失效。
- 查看真实 ZIP 地址:
composer show vendor/package --verbose,留意dist.url字段 - 国内公开镜像(如阿里云、USTC)只缓存
packages.json和provider-*.json,不托管 ZIP 文件 - 真正“全量镜像”需自己部署
nginx或varnish反向代理,并在响应头中透传X-OAuth-Scopes,否则 GitHub/GitLab 的 ZIP 下载必 403
Satis 是什么,它怎么解决私有包分发问题
Satis 不是镜像工具,而是“静态包仓库生成器”:它扫描你指定的 VCS 仓库(GitHub/GitLab),把每个 tag 打包成 ZIP,再生成索引页和 packages.json,最终输出一整套可托管在任意 HTTP 服务上的静态文件。它天然绕过所有 OAuth 和 rate limit 问题,因为 ZIP 全部由你自己的服务器生成并托管。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 关键配置项:
"archive": {"directory": "dist", "format": "zip", "prefix-url": "https://your-company.github.io/composer-packages/dist/"}——这个prefix-url必须可公开访问,且路径末尾带/dist/ - 默认跳过
dev-分支,如需包含,设"skip-dev": false - 生成后只需把整个
public/目录扔到 GitHub Pages、nginx或 S3 上即可,无需 PHP 运行环境
项目级如何正确启用私有仓库 + 官方镜像共存
Composer 2.x+ 默认把 packagist.org 当作硬编码权威源,不走你写的 repositories 列表;只有显式配置 repo.packagist,元数据请求才会转向镜像站。但私有包必须通过 repositories 显式声明,二者必须共存且互不干扰。
- 手动编辑
composer.json,在根节点添加:"packagist.org": false(注意:不是放在repositories内部) - 在
repositories字段里同时定义:"packagist": {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}和"my-private": {"type": "vcs", "url": "https://git.internal.company/pkg"} - 别用
composer config repo.packagist命令覆盖已有repositories,它会清空你已配的私有源 - 验证是否生效:
composer install -vvv,搜日志里的GET https://请求地址——看到的是你的私有域名还是mirrors.aliyun.com,一眼就清楚
CI/CD 和 Docker 中镜像不生效的常见原因
这些环境常忽略用户上下文,导致全局配置静默失效。
- Docker 容器默认没有
~/.composer目录,composer config -g写进去也随容器销毁而消失;必须在Dockerfile的RUN阶段显式执行该命令 - 宝塔后台或计划任务以
www用户身份运行,但你用root执行了composer config -g,结果配置写进了/root/.composer/config.json,www用户根本读不到 - GitHub Actions 若只缓存
vendor/,不缓存~/.composer,每次构建都重走默认源;建议缓存整个~/.composer目录 - CI 脚本中不要依赖全局配置,改用临时参数:
composer install -vvv --repository-url=https://my-satis-server.com/
最关键的复杂点在于:ZIP 包分发路径和元数据路径必须解耦设计,且所有 dist.url 必须指向你可控的 HTTPS 服务;一旦依赖外部 Git 平台的 release 下载,就等于把企业交付链路交给了第三方限流策略。

















