如何搭建私有的Composer镜像源?(Satis入门教程)

发布时间 - 2026-01-23 00:00:00    点击率:
Satis仅静态生成符合Composer协议的JSON+ZIP包集合,不代理实时包、不同步新版本、无Web界面;需手动构建、配置Git源、设type为library等,适合内网或审计严格场景。

直接用 satis 搭建私有 Composer 镜像源,不是“配置一下就能用”,而是得先理清它不解决什么:它不代理 packagist.org 的实时包,不自动同步新版本,也不提供 Web 界面上传或搜索功能。它只做一件事——静态生成一个符合 Composer repositories 协议的 JSON + ZIP 包集合,适合内网、审计严格或只用固定几个私有包的场景。

为什么不用 Toran Proxy 或 Private Packagist?

因为它们是商业/托管服务,需要 License 或网络连通性;而 satis 是纯 PHP 命令行工具,输出全是静态文件,扔进 Nginx/Apache 就能用,零运行时依赖,审计友好。

常见错误现象:satis build 报错 Could not find packag

e xxx,往往是因为目标包没设 "minimum-stability": "stable",或 composer.json 里没声明 "type": "library" —— satis 默认只收录 typelibrarymetapackageproject 的包。

  • 确保所有要镜像的私有包都已发布到 Git(如 GitLab 私有仓库),且 composer.json 中有明确 "name"(格式必须是 vendor/name
  • satis.json 中的 "repositories" 列表,写的是源地址(Git URL),不是你本地路径
  • 别把 satis.json 和项目 composer.json 混为一谈:前者定义“我要镜哪些包”,后者定义“我依赖哪些包”

satis.json 核心字段怎么写?

最小可用配置只需三块:name(镜像名)、homepage(镜像首页 URL,会影响生成的 packages.json 里包的 dist.url)、repositories(源列表)。其他都是可选。

容易踩的坑:"output-dir" 必须是 Web 可访问路径(比如 /var/www/satis),且 satis build 运行用户要有写权限;"require-all" 设为 true 会拉取所有分支/Tag,但若某分支 composer.json 缺失或语法错误,整个构建就中断。

{
    "name": "My Private Repository",
    "homepage": "https://satis.internal",
    "repositories": [
        { "type": "vcs", "url": "https://git.internal/project-a" },
        { "type": "vcs", "url": "https://git.internal/project-b" }
    ],
    "require-dependencies": true,
    "archive": {
        "directory": "dist",
        "format": "zip",
        "skip-dev": true
    },
    "output-dir": "/var/www/satis"
}

build 前必须确认的三件事

satis build 不是黑盒命令,它背后会调用 git clonecomposer installzip,任何一步失败都会卡住或静默跳过。

  • 运行 satis 的机器必须能 git clone 所有 repositories 地址(检查 SSH key / HTTPS token / GitLab CI token 是否生效)
  • 如果私有包依赖了外部包(如 monolog/monolog),satis 默认不会拉取它们 —— 除非你在 satis.json 里显式 "require" 它们,或设 "require-dependencies": true(推荐)
  • 生成的 ZIP 包默认放在 dist/ 下,但实际 URL 路径由 "homepage" + "archive.directory" 拼出,比如 https://satis.internal/dist/vendor-name-package-name-zip-hash.zip,务必确保 Web Server 能正确路由到该目录

客户端怎么用这个镜像?

不是改 ~/.composer/config.json,而是项目级配置,避免污染全局。在项目根目录的 composer.json 里加 repositories,并设 packagist.orgfalse 关闭公共源:

{
    "repositories": [
        { "type": "composer", "url": "https://satis.internal" },
        { "packagist.org": false }
    ],
    "require": {
        "internal/project-a": "^1.2"
    }
}

注意:"type": "composer" 表示这是一个完整的 Composer 镜像源(含 packages.json),不是单个 VCS 仓库;如果漏掉 "packagist.org": false,Composer 仍会 fallback 到官方源,导致私有包被忽略或版本冲突。

最常被忽略的一点:每次更新私有包的 Git Tag 后,必须手动重新运行 satis build,然后清空客户端 ~/.composer/cache —— Composer 缓存 packages.json 默认 5 分钟,不清理可能拉到旧清单。


# php  # js  # git  # json  # composer  # apache  # nginx  # 工具  # proxy  # 路由  # gitlab  # 镜像源  # require  # Directory  # Token  # private  # internal  # var  # https  # ssh  # 镜像  # 它不  # 新版本  # 里加  # 内网  # 的是  # 都是  # 客户端  # 几个  # 我要 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript如何实现错误处理_try...catch如何捕获异常?  长沙做网站要多少钱,长沙国安网络怎么样?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  LinuxShell函数封装方法_脚本复用设计思路【教程】  Python数据仓库与ETL构建实战_Airflow调度流程详解  如何彻底卸载建站之星软件?  香港服务器选型指南:免备案配置与高效建站方案解析  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Python自动化办公教程_ExcelWordPDF批量处理案例  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何在香港服务器上快速搭建免备案网站?  Android自定义listview布局实现上拉加载下拉刷新功能  敲碗10年!Mac系列传将迎来「触控与联网」双革新  魔方云NAT建站如何实现端口转发?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Python3.6正式版新特性预览  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  如何快速登录WAP自助建站平台?  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  智能起名网站制作软件有哪些,制作logo的软件?  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  详解jQuery中的事件  北京的网站制作公司有哪些,哪个视频网站最好?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  公司门户网站制作流程,华为官网怎么做?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  如何在自有机房高效搭建专业网站?  Python并发异常传播_错误处理解析【教程】  简单实现jsp分页  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何构建满足综合性能需求的优质建站方案?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel如何处理和验证JSON类型的数据库字段  中山网站制作网页,中山新生登记系统登记流程?  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel中的withCount方法怎么高效统计关联模型数量  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  企业网站制作这些问题要关注