项目级repositories配置必须显式声明"packagist": false开关并置于数组末尾,否则Composer仍会fallback至packagist.org;私有源需用composer config repositories.xxx添加,且Satis镜像须生成完整packages.json和dist/ZIP包。

项目级 repositories 配置必须显式声明 packagist 键名
团队共享私有开发包,不能靠全局镜像源“顺带覆盖”。composer.json 里 repositories 字段必须包含一个 "packagist": false 的开关,否则 Composer 仍会偷偷连 packagist.org,哪怕你写了私有源也无效。
正确写法是:
{
"repositories": [
{
"type": "composer",
"url": "https://satis.internal/"
},
{
"packagist": false
}
]
}
注意三点:
-
"packagist": false必须是独立对象,不能合并进前面的源里 - 顺序不能错:私有源在前,
packagist: false在后;否则 Composer 先查私有源失败后仍 fallback - 如果已有其他私有 VCS 源(如 GitLab),它们也要放在
packagist: false前面,统一归入数组
composer config repo.packagist 命令只对 packagist.org 有效,不适用于私有源
很多人误用 composer config repo.packagist composer https://satis.internal/ 想把私有源设成“主镜像”,结果报错或静默失效。这个命令专用于替换官方源,不是通用仓库注册方式。
要往项目 composer.json 中添加私有源,必须用:
composer config repositories.satis composer https://satis.internal/
它会自动在 repositories 数组中插入一个 key 为 satis 的对象。后续执行 composer require internal/utils 时,Composer 就会从该 URL 查 packages.json。
常见错误:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 手写
"repositories": "https://satis.internal/"→ 类型缺失,被忽略 - 漏掉
type: "composer"→ Composer 不识别,直接跳过 - URL 缺末尾斜杠 → 请求变成
https://satis.internal/packages.json而非https://satis.internal//packages.json,404
Satis 镜像必须生成完整 packages.json 和 dist/*.zip
团队成员 composer install 报 Could not find package,90% 是 Satis 构建不全。Satis 不是“同步文件夹”,它必须输出两个东西才能被 Composer 正确消费:
-
packages.json:含所有包的版本、dist 下载地址、hash 校验值,必须能被 HTTP GET 直接访问(路径如https://satis.internal/packages.json) -
dist/目录下的 ZIP 归档:每个包对应一个vendor-name/package-name/version-hash.zip,且packages.json中的dist.url必须指向该 ZIP 的可访问 URL
关键配置项(satis.json 中):
-
"require-all": true— 否则只镜像composer.json中已require的包,新成员拉代码后无法装未显式声明的依赖 -
"archive": {"directory": "dist", "format": "zip", "skip-dev": true}— 缺失则composer install --no-dev仍走 git clone,内网通常不通 -
"repositories"列表里每个私有包必须写全"type": "vcs"和"url",不能只写 URL 字符串
CI 流水线里 composer install 失败,大概率是缓存没清或 DNS 不通
本地能装,CI 报 Could not fetch https://satis.internal/packages.json,先别改配置。检查三件事:
- CI 容器是否能
curl -I https://satis.internal/packages.json?很多公司 CI 网络策略限制内网域名解析,需在/etc/hosts或 DNS 配置中显式映射 - 是否复用了旧缓存?
composer clear-cache必须在composer install前执行,否则仍读本地旧元数据 - 是否用了
--no-cache?这个参数只禁用 Composer 自身缓存,不影响系统 DNS 缓存或代理缓存
最稳妥的 CI 写法:
composer clear-cache composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ composer config repositories.satis composer https://satis.internal/ composer install --no-interaction --prefer-dist
注意:config -g 在 CI 中慎用——若用 sudo 执行,可能写进 root 用户配置,而构建进程以普通用户运行,读不到。
真正难搞的不是配置本身,而是 Satis 输出的 packages.json 里每个包的 dist.url 是否拼对了。它默认用相对路径,一旦 Nginx 配置的 root 不匹配,ZIP 就 404,但 Composer 报错只说“package not found”,不提示是 dist 下载失败。

















