satis 是唯一可行的私有 packagist 静态镜像方案,通过生成 packages.json 和 dist 归档实现离线、合规与 ci/cd 同步;但它不支持私有包发布或实时管理,仅是快照生成器。

私有 Packagist 不能直接“镜像备份”公共源,Satis 是唯一可行的静态镜像方案;但多数团队真正需要的不是镜像,而是可控的私有包托管——别在 packagist.org 上白费劲。
为什么 Satis 是唯一靠谱的镜像方案
Satis 本质是生成静态 packages.json 文件的构建工具,不依赖运行时服务,所有元数据落地为 JSON + dist 归档,天然适合内网离线、审计合规、CI/CD 自动同步等场景。它不提供 Web 界面或实时搜索,但正因如此,才能保证每次 composer install 拉取的版本与构建时刻完全一致。
- 必须用
php bin/satis build satis.json web/显式触发构建,修改 Git tag 或新增仓库后不会自动更新 -
satis.json中的"require-all": true可镜像整个 packagist.org,但实际中应限制范围(如只镜像monolog/*、symfony/*),否则体积爆炸、构建超时 - dist 包默认不下载,需显式加
"archive": {"format": "tar", "skip-dev": true},否则composer install --prefer-dist仍会回源下载 - 生成的
web/目录必须通过 HTTPS 服务暴露,且 URL 必须以/结尾(如https://pkgs.internal.example.com/),否则 Composer 会拼错packages.json路径
repositories 配置错一个字符就拉不到包
Composer 不会自动发现你搭好的 Satis 服务,必须在项目根目录 composer.json 的 repositories 字段里逐字写对。常见错误不是没搭好,而是这里配错了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 类型必须是
"type": "composer",不是"package"或"vcs";Satis 返回的是标准 Composer 元数据格式,只认这个 type - URL 必须指向
packages.json的完整路径,例如"url": "https://pkgs.internal.example.com/"(结尾斜杠不能少) - 若 Satis 启用了 HTTP Basic Auth,认证信息只能写进
auth.json,且文件权限必须是600,否则 Composer 直接忽略 - 想彻底禁用 packagist.org 回退,得在
repositories里加一项:{"packagist.org": false},位置无关,但必须存在
镜像 ≠ 替代:别把 Satis 当成私有 Packagist
Satis 不支持私有包发布、不处理 OAuth token 刷新、不提供 Web 管理界面、不支持按需同步。它只是个“快照生成器”。如果你需要开发者 push 包、自动触发构建、权限分级、漏洞扫描,Satis 就不该是首选。
- 私有包开发流程建议走 GitLab Package Registry 或 GitHub Packages:它们原生支持
composer类型 registry,composer config --global github-oauth.github.com xxx即可认证 - GitLab/GitHub 的私有包 require 时,version 必须对应 Git tag(如
v2.1.0),不能靠composer.json里的 version 字段;打完 tag 务必git push --tags - CI 环境中避免用
composer config --global写凭据,改用COMPOSER_AUTH环境变量注入 JSON 字符串,更安全也更灵活 - Satis 构建机上执行
composer clear-cache是必须步骤,尤其当你强制推送了同名 tag —— Git 服务器缓存可能未刷新,Composer 仍会拉旧 commit
最常被忽略的一点:Satis 镜像的包,其 autoload 和 require 关系完全继承自原始包的 composer.json,它不做任何转换或校验。如果上游包写了错误的 PSR-4 映射,你在内网拉下来照样 Class not found —— 镜像不解决质量,只解决可达性。










