satis构建失败的首要原因是未生成dist/目录及zip包,导致composer回退git clone;必须配置完整archive块、验证packages.json中dist.url指向内网zip地址,并确保全局和项目级镜像配置均为合法json对象。

确认 Satis 构建输出包含 dist/ 目录和完整 packages.json
内网 composer install 失败的首要原因,是 Satis 没生成可直接下载的 zip 包,导致 Composer 回退到 git clone —— 而内网通常禁用 git:// 或 ssh:// 协议。必须确保 satis.json 中的 archive 块完整且生效:
-
"archive": {"directory": "dist", "format": "zip", "skip-dev": true}—— 缺任意字段,dist/下就不会产出 zip 文件 - 构建后检查
web/dist/目录是否存在,且里面包含类似guzzlehttp-guzzle-7.8.1-zip-abc123.zip的文件 - 同时验证
web/packages.json里每个包的dist.url字段是否指向http://your-satis-host/dist/xxx.zip,而不是source.type: "git"类型的链接
全局配置 repo.packagist 必须为对象、含 type 和 HTTPS 斜杠
仅运行 composer config -g repo.packagist https://packagist.internal/ 是不够的;新版 Composer 会静默忽略非法格式并 fallback 到官方源。正确写法必须是:
composer config -g repo.packagist '{"type":"composer","url":"https://packagist.internal/"}'
关键点:
- 键名严格为
repo.packagist(不是repos.packagist或packagist.org) -
type字段不可省略,否则 Composer 不认为这是镜像源 -
url必须以https://开头,且以/结尾;用http://会被拒绝,除非显式加--allow-http(不推荐) - 执行后立刻运行
composer config -g repo.packagist确认输出是 JSON 对象,而非空或报错;若失败,大概率是 PHP 禁用了proc_open或putenv,需检查php.ini并重启 PHP
项目级 repositories 需显式注册同名内网源
即使全局已配好,某些项目仍会因 composer.json 里存在 repositories 字段而覆盖全局行为。常见错误是只写:
"repositories": ["https://packagist.internal/"]
这会被 Composer 当作字符串 URL 忽略。必须写成对象数组:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"repositories": [
{
"packagist": false
},
{
"type": "composer",
"url": "https://packagist.internal/"
}
]
说明:
-
"packagist": false显式关闭官方源,避免混用 - 第二项必须与全局配置完全一致(
type+url),否则 Composer 无法识别为同一源,导致部分包走内网、部分走外网 - 私有 VCS 包(如 GitLab 内部 SDK)也要单独声明:
{"type": "vcs", "url": "https://gitlab.internal/internal-sdk"},不能合并进主仓库
require-all: true 决定能否拉到历史 tag 和 dev 分支
默认 Satis 只同步 composer.json 中显式 require 的包及其最新稳定版。如果你依赖某个包的 v2.3.0 或 dev-feature/x 分支,但没在 satis.json 的 require 里写死,它就不会被同步 —— 安装时直接报 Could not find package。
解决方法是在 satis.json 顶层加:
"require-all": true
注意:
- 启用后构建时间显著增加,尤其当上游仓库有大量 tag 和分支时
- 若只想同步特定范围,可用
"require-dependencies": true+"minimum-stability": "stable"组合控制粒度 - 私有包若通过
vcs类型引入,其所有分支和 tag 默认都会被索引,不受require-all影响
packages.json 里每个包的 dist.url 是否真实可达、以及 Composer 运行时看到的源是否真的被识别为「同一个」——这两处出问题,现象都是“看起来配好了,但 install 依然连外网”。










