返回博客

理解 Steam manifest 文件(精简版)

.manifest 文件里到底装了什么,SteamTools 为何需要它,文件名何时重要。

2026年6月8日SteamTools TeamSteamTools Team
理解 Steam manifest 文件(精简版)

.manifest 文件是 Steam 生态里最被低估的一块拼图。Steam 客户端里没有它,下载游戏时也拿不到它,Steam UI 里你永远不会看到它。但对 SteamTools 来说,它是必需的。这篇文章是它内部结构的精简版。

manifest 做了什么

manifest 是一个小(通常 1–4 KB)的文本文件,列出一个 Steam 游戏的每一个 depot,以及 SteamTools 跟 Steam CDN 通信时需要的加密密钥。

一个真实的单 depot app 示例(节选):

"appbuild"
{
  "appid"  "400"
  "name"   "Portal"
  "buildid"  "1234567"
  "depots"
  {
    "400"
    {
      "manifest"  "1234567890abcdef..."
      "size"  "9876543210"
    }
  }
}

那串长长的 hex 就是 depot 解密密钥。没有它,SteamTools 不知道该向 Steam CDN 请求哪些分片,Steam CDN 也会直接拒绝请求。

为什么文件名很重要

SteamTools 在 depotcache 文件夹里找的文件名必须是 <AppID>_<branch>.manifest。把一个能用的 400_public.manifest 改名为 400-beta.manifest 放到错误分支的文件夹里,SteamTools 会拒绝安装——文件名就是索引。

这也是为什么我们的生成器返回的文件名里永远带分支。只需要默认 public 分支时,branch 字段留空;想要 betaexperimental,点生成前先在 branch 框里写好。

为什么 manifest 是按 app、按分支区分的

每个 Steam 分支(public、beta、experimental、internal……)都有自己独立的 buildid 和密钥。同一个 App ID 可以有半打不同的 manifest,每个活跃分支一份。Lua 脚本就是用来告诉 SteamTools 当本地有多个分支时,优先用哪个。

manifest 何时会过期

manifest 跟具体的 build 绑定。游戏一更新,老 manifest 立刻失效——新 build 有新文件分片、新 size、(通常)新密钥。拿过期 manifest 去装游戏,SteamTools 要么下错文件,要么中途挂掉。

这也是为什么热门游戏列表每 5 分钟刷新一次:游戏随时会打补丁,一周前的 manifest 是让安装挂掉的最大嫌疑。

生成器找不到 manifest 的常见原因

  1. App ID 写错了。 SteamDB 是最快的核对方式。
  2. App 被区域锁定。 部分发行商只对特定商店开放 manifest。目前我们用 cc=us&l=english,更多区域在 路线图 上。
  3. App 已从 Steam 完全下架。 Valve 偶尔会彻底下架一个 app 并清掉 depot 数据。App ID 还能查到,但已经没东西可下。

如果生成器返回错误,错误信息通常会告诉你属于这三种的哪一种。FAQ 页面 有最常见错误码的对照表。