如何搭建私有的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,往往是因为目标包没设 
"minimum-stability": "stable",或 composer.json 里没声明 "type": "library" —— satis 默认只收录 type 为 library、metapackage、project 的包。
- 确保所有要镜像的私有包都已发布到 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 clone、composer install、zip,任何一步失败都会卡住或静默跳过。
- 运行
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.org 为 false 关闭公共源:
{
"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查询问题解决
企业网站制作这些问题要关注
上一篇:win10重启命令是什么
上一篇:win10重启命令是什么

