Satis 不能直接扔进 COS 存储桶,因为 COS 默认域名不支持直链访问 packages.json 等文件,必须用静态网站域名、设公有读权限、将 packages.json 放根目录、手动设置 Content-Type 为 application/json,并在 satis.json 中配置 archive 生成 ZIP 到 COS。

为什么不能直接把 Satis 输出扔进 COS 存储桶就完事?
因为 COS 静态网站托管功能只对 index.html、404.html 等特定路径做自动路由,而 Composer 依赖的 packages.json、provider-2023-07.json 等文件必须能被 HTTP 客户端按精确路径访问——COS 默认域名(xxx.cos.ap-guangzhou.myqcloud.com)不支持目录索引和重定向,会导致 composer install 报 404 Not Found 或 Failed to decode JSON。
关键点:Satis 生成的是纯静态文件集合,不是传统“网站”,它依赖 Web 服务器对缺失路径返回 404(而非 403 或下载提示),且要求所有资源可直链访问。
- 必须用 COS 的 静态网站域名(
xxx.cos-website.ap-guangzhou.myqcloud.com),不能用默认域名 - 存储桶权限必须设为 公有读,否则 Composer 请求会卡在 403
-
packages.json必须位于根路径,不能放在/dist/或/web/子目录下,否则 Composer 找不到入口 - COS 不支持
Content-Type: application/json的自动识别,需手动设置对象元数据,否则某些 PHP 版本会解析失败
如何给 COS 中的 packages.json 设置正确的 Content-Type?
COS 控制台上传单个文件时,无法批量修改元数据;若 packages.json 被识别为 text/plain,Composer 会因 MIME 类型不匹配拒绝解析。必须显式设为 application/json。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 上传后,在控制台选中
packages.json→ 点击「更多」→「修改元数据」→ 添加键Content-Type,值填application/json - 同理,所有
provider-*.json、include/all$*.json文件都需同样设置 - 若用 CLI 工具(如
coscmd或coscli)同步,加参数--content-type application/json,避免逐个点选 - 注意:COS 对大小写敏感,
content-type小写键名无效,必须首字母大写
composer.json 里怎么配才能让项目认出 COS 托管的 Satis 源?
配置错一个字符就会 fallback 到 packagist.org,导致私有包拉不到或报 Could not find package。重点不在 URL 是否能浏览器打开,而在 Composer 是否把它当有效 Composer 源处理。
-
repositories必须是顶层字段,不能嵌套在config或extra里 - URL 必须以
/结尾:"url": "https://my-pkg-bucket-1250000000.cos-website.ap-guangzhou.myqcloud.com/",否则 Composer 会拼成.../packages.json变成.../packages.json/packages.json - 必须显式禁用官方源:
"packagist.org": false,否则即使你写了私有源,Composer 仍会先查 packagist.org - 如果 COS 开启了强制 HTTPS,但你的
composer.json写的是http://,会 301 重定向失败,务必统一用https://
为什么 Satis 构建后有些包 ZIP 下载 403?
不是 COS 权限问题,而是 Satis 默认生成的 dist.url 仍指向原始 Git 仓库(如 GitHub Releases),而 COS 只托管了 packages.json,没托管 ZIP——Composer 会跳过 COS,直接去原始地址下载,结果因 OAuth 或 rate limit 被拒。
- 必须在
satis.json中启用archive配置,让 Satis 自己打包 ZIP 并存到 COS:
"archive": {
"directory": "dist",
"format": "zip",
"prefix-url": "https://my-pkg-bucket-1250000000.cos-website.ap-guangzhou.myqcloud.com/dist/"
}
prefix-url 必须可公开访问,且末尾带 /dist/,否则生成的 dist.url 字段路径错误dist/ 目录已创建并设为公有读,否则 ZIP 上传后仍是 403packages.json 里某包的 dist.url 是否已变成 COS 地址,而不是 https://api.github.com/...
packages.json,不代表 Composer 能用它。

















