能,但必须用服务器端钩子(如post-receive),不能用客户端钩子;客户端钩子只在本地运行,无法触发Satis构建,只有服务端收到推送后执行的post-receive才能真正调用satis build。

Git钩子能替代Webhook触发Satis构建吗
能,但必须用服务器端钩子(如post-receive),不能用客户端钩子。客户端钩子(比如pre-commit)只在开发者本地运行,对镜像服务毫无影响;只有 Git 服务端收到推送后执行的post-receive,才能真正触发satis build。
常见错误是把.git/hooks/post-receive脚本直接写在项目仓库里——它不会随克隆传播,且权限常被忽略。正确做法是:在 Git 服务器(如 GitLab 自托管实例、Gitee 企业版或 bare repo)上配置该钩子,并确保运行用户(如git)有权限读satis.json、写输出目录、执行php bin/satis build。
- 脚本开头必须
cd /path/to/satis/,否则satis build找不到配置文件 - 避免硬编码路径,用
read -r line解析 Git 推送的 ref(如refs/tags/v1.2.0),只对 tag 或特定分支(如main)触发构建 - 加
set -e和日志重定向(如> /var/log/satis-build.log 2>&1),否则失败静默、无从排查
post-receive里执行satis build为什么总报错路径不对
根本原因是post-receive执行时的当前工作目录是 bare repo 的.git目录,不是satis.json所在位置。Satis 不会自动向上查找配置,必须显式chdir()或用绝对路径调用。
典型错误写法:php bin/satis build satis.json web/ —— 这会在/var/repo/project.git/下找bin/satis和satis.json,必然失败。
GInstall OneClick — 一键安装 GitHub 项目:规划、克隆、安装 Node 依赖、运行开发脚本。适用于想要获取 GitHubNode.js 项目的用户。
- 正确写法:
cd /opt/satis && php bin/satis build satis.json /var/www/satis/ - 输出目录(如
/var/www/satis/)需被 Web 服务(Nginx/Apache)直接 serve,且 URL 必须以/结尾,否则 Composer 请求packages.json会返回 404 - 如果用
archive功能生成 dist 包,确保"archive": {"directory": "dist"}对应的真实路径可写,且 Web 服务对该子目录有读权限
Git钩子触发的增量更新怎么控制只重建变动包
Satis 本身不支持“只更新某几个包”的增量模式,它的build命令默认全量扫描所有仓库。所谓“增量”,实际靠的是 Git 钩子传入的推送信息来过滤范围。
例如,Gitee 推送refs/tags/v2.1.0到https://git.internal/utils,你可以在post-receive中提取这个 URL 和 ref,然后只运行:php bin/satis build --repository-url https://git.internal/utils --stability dev satis.json web/。
-
--repository-url参数限制 Satis 仅扫描指定 VCS 仓库,跳过其他未变动的源 -
--stability要与目标包的minimum-stability匹配,否则新 tag 可能被忽略 - 别用
"require-all": true——它强制拉取所有分支和 dev-tag,导致packages.json膨胀、Composer 加载超时甚至内存溢出 - 若多个私有包共用一个 Satis 实例,建议按业务域拆成多个
satis.json+ 多个post-receive钩子,比单一大配置更可控
为什么Git钩子更新后Composer还是拉不到新版本
最常被忽略的是 Composer 客户端缓存。即使 Satis 已生成新packages.json并成功响应 HTTP 请求,Composer 默认复用本地缓存(~/.composer/cache/repo/https---your-mirror.com/)中的元数据,15 分钟内不过期。
这不是镜像服务的问题,而是 Composer 的设计行为。验证是否真生效,不能只看curl https://your-mirror.com/packages.json | head -n5,得用 Composer 自身流程:
- 在干净目录执行:
composer init -n && composer config repositories.packagist {type:composer,url:https://your-mirror.com/} && composer require vendor/package-name:dev-main - 若失败,加
-vvv看日志是否出现Reading packages.json from cache——出现即说明缓存未刷新 - 强制刷新命令:
composer update --refresh(Composer ≥2.5),或手动删缓存:rm -rf ~/.composer/cache/repo/https---your-mirror.com/ - CI 环境务必加
--no-cache参数,避免因缓存导致构建结果不可重现

















