Composer全局配置repo.packagist仅替换元数据源(packages.json),不重写包的dist.url(如GitHub ZIP链接),故内网部署需确保dist目录可直连访问、Nginx正确暴露Satis output-dir、URL末尾带/、MIME类型设为application/json,且项目级repositories数组中私有源配置须完整准确。

不能只改 composer config -g repo.packagist,那只是换元数据入口,ZIP 包仍会去 GitHub 下载——局域网根本打不开。
为什么全局 config 不生效
执行 composer config -g repo.packagist composer https://pkgs.internal/ 后,packages.json 确实会从内网地址拉,但每个包的 dist.url(比如 https://github.com/monolog/monolog/releases/download/2.10.0/monolog-2.10.0.zip)仍保持原始值。Composer 不会重写 dist 地址,它只认你给它的 URL 路径。
验证方式:运行 composer show monolog/monolog --verbose,盯着输出里的 dist.url 字段——如果还是 GitHub 或其他外网地址,说明 ZIP 根本下不来。
- 国内镜像(阿里云、腾讯云)只缓存
packages.json和provider-*.json,不托管 ZIP -
dist/目录必须能被 HTTP 直连 GET,例如https://pkgs.internal/dist/monolog/monolog/2.10.0/xxx.zip - SELinux、文件权限、Nginx root 配置错误,都会导致 404 ——不是网络不通,是路径没暴露对
Satis 生成的静态文件怎么让 Composer 认得
Satis 不是服务,只是个文件生成器。它不监听端口,也不处理请求,所有东西都写进 output-dir 目录(比如 /var/www/satis/web),靠 Nginx 暴露出去。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- Nginx 的
root必须精确指向 Satis 的output-dir,不能多一层或少一层 - 必须显式声明 JSON MIME 类型:
types { application/json json; },否则返回text/plain,Composer 拒绝解析 - 镜像 URL 必须以
/结尾,比如"url": "https://pkgs.internal/";少一个斜杠,Composer 会拼成https://pkgs.internalpackages.json - 检查
dist/下 ZIP 文件是否真实可访问,用curl -I https://pkgs.internal/dist/xxx.zip看 HTTP 状态码
项目级 composer.json 的 repositories 怎么写才对
私有源配置必须写在你要 require 包的那个项目的根目录 composer.json 里,不是 Satis 自己的配置文件,也不是私有包自己的 composer.json。
-
repositories必须是 JSON 数组,不能是对象({"my-repo": {...}}是错的) - 每项必须含
"type": "composer"和"url",且url值末尾带/ - 多个源按顺序匹配,第一个命中就停,同名包后面的会被忽略
- 如果用了 HTTPS 私有源,凭据只能走
auth.json,且权限必须是600:chmod 600 auth.json,否则 Composer 静默忽略
dist ZIP 路径不可 GET 的常见卡点
即使 Satis build 成功、Nginx 配置看着没问题,dist/ 下 ZIP 仍可能 403/404。这不是 Composer 的问题,是 Web 层拦住了。
- SELinux 默认禁止 Nginx 访问非标准路径,临时放开:
setsebool -P httpd_can_network_connect 1 - 文件权限不对:
chown -R www-data:www-data /var/www/satis/web(根据实际用户调整) - Nginx location 块里写了
deny all;或没放开.zip后缀的访问 - URL 中
dist/路径和 Satissatis.json里archive.directory不一致
最易被忽略的是:Satis 生成的 packages.json 里每个包的 dist.url 是相对路径(如 dist/monolog/monolog/2.10.0/xxx.zip),它依赖 Nginx 的 root + 请求路径共同拼出完整 URL。错一环,ZIP 就断供。

















