概述
BuildPatch工具(BPT)是一款命令行工具,允许你将产品的二进制文件安全地上传到Dev 沙盒 中。然后你可以通过开发人员门户中的构建和二进制分段,将二进制文件指定给商品的正确构件,并进行测试。(对于部分组织,此分段可能名为 构建 。)通过发布管理流程,你可以提升流程,你可以在沙盒之间提升通过BuildPatch工具上传的二进制文件。
开始之前
在你开始前,请阅读以下小节,收集准备使用BuildPatch工具所需的信息。
下载BuildPatch Tool
你可以在开发这门户的构件和二进制页面中下载BuildPatch工具(BPT)。
- 在开发人员门户中,点击 我的产品 > Epic Games商城 > 构件和二进制文件 。
- 右上角点击 下载工具 。
- 下载完成后,在本地机器上安装工具。
获取凭证ID
你需要在开发人员门户中找到以下这些ID。
产品的Client ID和Client Secret 。
在你的组织中,所有属于Owner、Admin 或 Store 的角色,可以获取以下凭证:
- 点击开发人员门户中的 产品 > 产品设置 。
- 选择 通用 选项卡。
- 找到Build Patch Tool凭证分段,保存客户端ID和密钥。
商品的构件名称和ID
- 点击 我的产品 > Epic Games商城 > 构件和二进制文件 。
- 在列表中,点击需要获取凭证的商品的名称。
- 在管理构件页面,点击编辑细节面板右侧的 箭头图标 。
- 保存构件名称和ID。
- 为其他商品执行相同操作。
商品的商品ID
- 点击 我的产品 > Epic Games商城 > 商品 。
- 在列表中,点击需要获取凭证的商品的名称。
- 在商品的详细信息界面,找到ID分段并保存商品ID。
- 为其他商品执行相同操作。
审核命令行中的路径
由于命令提示符在命令行上对 \"
(反斜杠直接后跟双引号)有独特的解释方式,所以在BuildPatchTool参数中指定路径时,要遵循以下至少一个指导意见:
- 目录名称不要附加尾部斜杠。
- 目录分隔符用正斜杠。
- 不要将路径括在引号内(如果路径包含一个或多个空格,这一点无法做到)。
- 使用另一个反斜杠仅对括在双引号内的尾部反斜杠转义(不推荐,因为容易出错)
有效路径语法示例
-BuildRoot="D:/MyFolder/"
-BuildRoot=D:\MyFolder\
-BuildRoot=D:\MyFolder
-BuildRoot=D:/MyFolder/
-BuildRoot=D:/MyFolder
-BuildRoot="D:\MyFolder\\"
无效路径语法
在命令行上定义路径时,以下语法 将无效 :
-BuildRoot="D:\MyFolder\"
使用BuildPatch工具
初始设置
将BuildPatchTool ZIP文件的内容提取到可访问待上传二进制文件的机器。该机器还需要能够联网,以便与Epic后端通信。
ZIP文件链接始终与最新版BPT保持同步更新。如果无法访问该文件,请在开发人员支持网站上创建私密讨论,获取帮助。
身份验证
身份验证是通过向BuildPatchTool提供 客户端ID
和 客户端密钥
来执行的。必须使用命令行参数为每个操作提供这些信息。 Epic将为你签发此ID和密钥,用作凭证。如需这些凭证,请前往开发人员门户,找到“我的产品(Your Product) > 产品设置(Product Settings) > 通用(General)选项卡 > Build Patch Tool凭证(Build Patch Tool Credentials)。
BuildPatchTool使用唯一的 客户端ID
和 客户端密钥
,独立于你的游戏可能使用的EOS客户端ID。确保你使用开发人员门户的“产品设置(Product Settings)”分段中可用的Build Patch Tool凭证。SDK凭证下列出的客户端无法用于此工具。
凡是与Epic的后端服务进行交互的操作,必须提供 ClientId
参数。客户端密钥必须使用 ClientSecret
或 ClientSecretEnvVar
参数提供。
如果使用 ClientSecret
参数,客户端密钥应该一字不差地作为参数值传递:
如果使用 ClientSecretEnvVar
参数,你需要传递包含客户端密钥的操作系统环境变量的名称:
**我们推荐尽可能使用 ClientSecretEnvVar
参数,因为这样可防止密钥值出现在系统日志和命令行历史记录。 **最好是将客户端密钥存储在密钥管理系统中(如Hashicorp Vault),并在每次运行期间将其安全地注入到你的构建机器的环境中。
如何上传二进制文件
找到 Engine/Binaries/Win64/
目录。
从命令行以UploadBinary模式运行BuildPatchTool.exe,然后将其指向你的二进制文件(请参阅下面的CLI参数细节)。
这将处理你的二进制文件,将其上传到我们的云存储器,并将二进制文件注册到我们的后端:
请见下方说明,了解你必须指定的各个参数。你还可以在任意模式之后添加 "-help" 选项(例如, "BuildPatchTool.exe -mode=PatchGeneration -help"
),以获取有关必需参数的信息。
参数名称 | 说明 |
---|---|
OrganizationID | 使用随凭证提供的组织ID字符串。 |
ProductID | 使用随凭证提供的产品ID字符串。 |
ArtifactID | 指定随凭证提供的构件ID字符串。 |
ClientId | 请参阅身份验证小节。 |
ClientSecretEnvVar | 请参阅身份验证小节。 |
BuildRoot | 包含待读取和处理二进制文件的目录路径。它可以是驱动器根目录的绝对路径,也可以是当前工作目录的相对路径。此外,建议将此路径放在靠近驱动器根目录的位置,以免文件超出操作系统MAX_PATH限制(通常为260个字符)。 |
CloudDir | 一种目录,BuildPatchTool可以把要上传的文件保存在此目录下,每次运行时可以为空。与BuildRoot一样,这里可以是绝对路径或相对路径。(此位置用于缓存现有二进制文件的信息,并且应该是不同于BuildRoot参数的目录。此目录可以初始为空,BuildPatchTool会根据需要从Epic后端下载信息,并将其存储在CloudDir中。) |
BuildVersion | 该构件的版本字符串。对于构件的每个版本,该字符串需要是唯一的(与平台无关)。例如, BuildVersion-1.0 只能用于Windows或Mac系统,无法同时用于两者。版本字符串有以下限制:长度必须在1到100个字符之间,不允许有空格键,只应包含以下字符集 a-z,A-Z,0-9,或 .+-_ |
AppLaunch | 运行游戏时应启动的应用程序可执行文件的路径,相对于BuildRoot并位于其中。对于Mac二进制文件,这应该是.app文件夹中包含的可执行文件,通常位于Game.app/Contents/MacOS/Game。 |
AppArgs | 启动时要发送到应用程序的命令行。不需要额外参数时,可以将其设置为“”。 |
FileList(可选) | 文本文件的路径,其中包含二进制文件中要包含的文件。这些文件必须是相对于BuildRoot。这是使用FileIgnoreList的替代方法。 |
FileAttributeList(可选) | 文本文件路径,该文件包含一个文件列表以及应设置的对应特殊属性(例如,可执行位)。请参阅“设置特殊文件属性”小节,了解文件内容的说明。请注意,属性文件应放在BuildRoot之外,以免误与上传的二进制文件包含在一起。 |
FileIgnoreList(可选) | 文本文件路径,该文件包含应从生成的补丁数据中排除的文件列表。每个条目应独占一行,并且是相对于BuildRoot的路径。应使用正斜杠(“/”)分隔符。请注意,如果忽略文件位于BuildRoot之内,则其自己的相对文件路径需要包含在忽略列表中,以免将其包含在补丁数据中。 |
设置特殊文件属性
你可以将可选的 -FileAttributeList
参数与PatchGeneration模式搭配使用,将特殊属性应用于二进制文件中的文件,如可执行文件,或文件的标签组。请注意,启动应用程序(由 -AppLaunch
参数指定)会自动标记为可执行文件,不需要显式包含在此配置文件中。如果不需要设置特殊属性,可以忽略 -FileAttributeList
参数。
你的自定义 FileAttributeList
文件必须是文本文件,文件中包含一个或多个以换行符分隔的条目。每行必须包含用引号括起的(相对于BuildRoot的)文件路径,后跟要应用于所引用文件的一个或多个以空格分隔的属性:
"<QuotedRelativePathToFile>" <list of attributes>
条目示例
"Relative/Path/To/My/file.bin" executable tag:my_tag
"Second/Path/To/A/file.txt" tag:txt_files
支持以下文件属性标记:
executable
tag:my_tag
文件标记用于为Epic Games启动程序的选择性下载功能提供输入,公开在安装选项屏幕中。如果你觉得需要使用此功能,请联系Epic Games代表,因为该功能仍处于测试阶段。
设置桌面快捷方式图标
默认情况下,桌面快捷方式图标将设置为AppLaunch参数指示的应用程序可执行文件的图标。有两种方法可以更新此图标:
- 更新应用程序可执行文件中嵌入的图标
- 添加与应用程序可执行文件同名的单独.ico文件(例如:如果可执行文件是launch.exe,应使用launch.ico)
如何标记二进制文件
分块和上传过程完成后,你必须将标签应用到二进制文件,才可以从Epic Games启动程序访问它。将标签应用于二进制文件会将标签名称(例如“Live”)和平台(例如“Win32”)与单个二进制版本关联。你可以将多个标签分配给同一个二进制文件。
EpicGamesLauncher客户端将只查询与其当前运行的平台相关联的二进制文件。例如,Win32启动程序客户端只会使用Win32平台查询,因此它永远不会收到标有Windows或Mac的二进制文件。Windows x64客户端将仅查询使用Windows平台的二进制文件,依此类推。如果你确实有一个能与多个平台兼容的二进制文件(例如,兼容Windows和Win32),那么你可以将两个标签(每个平台一个)应用于同一个二进制文件,使其可用于两个平台,无需重新上传。
LabelBinary模式:
参数说明:
参数名称 | 说明 |
---|---|
OrganizationID | 使用随凭证提供的组织ID字符串。 |
ProductID | 使用随凭证提供的产品ID字符串。 |
ArtifactID | 指定随凭证提供的构件ID字符串。 |
ClientId | 请参阅身份验证小节。 |
ClientSecretEnvVar | 请参阅身份验证小节。 |
BuildVersion | 应标记的二进制文件的版本字符串。此版本的二进制文件必须已经注册,否则标记操作将被拒绝。 |
标记(Label) | 应用于二进制文件的标签名称。将二进制文件设置为公开时,此标记必须是字符串“Live”。此外,字符串“Archive”可用于按平台标记单个二进制文件,即使平台不再存在也应该保留二进制文件。大约一周后,自动清理作业将删除未标记的二进制文件。 |
平台(Platform) | 与要标记的二进制文件关联的平台。目前,平台必须是以下之一:[Windows、Win32、Mac] |
沙盒ID(SandboxId) | 用于标记此沙盒的ID。如果不提供,二进制文件会被标记为公开沙盒。 |
如何取消标记二进制文件
注意: 当你把二进制文件所有标签删除时,该二进制文件会在七天后自动删除。如果你想阻止这种删除,请在 不活跃的二进制文件(Inactive binaries) 部分中找到该二进制文件,并为其添加至少一个标签。
要删除先前设置的标签,你可以使用 UnlabelBinary 模式和用于 LabelBinary 模式的相同参数:
参数说明:
参数名称 | 说明 |
---|---|
OrganizationID | 使用随凭证提供的组织ID字符串。 |
ProductID | 使用随凭证提供的产品ID字符串。 |
ArtifactID | 指定随凭证提供的构件ID字符串。 |
ClientId | 请参阅身份验证小节。 |
ClientSecretEnvVar | 请参阅身份验证小节。 |
BuildVersion | 应标记的二进制文件的版本字符串。此版本的二进制文件必须已经注册,否则标记操作将被拒绝。 |
标记(Label) | 应用于二进制文件的标签名称。将二进制文件设置为公开时,此标记必须是字符串“Live”。此外,字符串“Archive”可用于按平台标记单个二进制文件,即使平台不再存在也应该保留二进制文件。大约一周后,自动清理作业将删除未标记的二进制文件。 |
平台(Platform) | 与要标记的二进制文件关联的平台。目前,平台必须是以下之一:[Windows、Win32、Mac] |
沙盒ID(SandboxId) | 指定二进制文件的沙盒ID。如果不提供,二进制文件将被标记为公共沙盒。 |
如何列出现有二进制文件
你还可以查询后端,使用 ListBinaries 模式检索你已注册的二进制文件列表:
参数说明:
参数 | 说明 |
---|---|
OrganizationID | 使用随凭证提供的组织ID字符串。 |
ProductID | 使用随凭证提供的产品ID字符串。 |
ArtifactID | 指定随凭证提供的构件ID字符串。 |
ClientId | 请参阅身份验证小节。 |
ClientSecretEnvVar | 请参阅身份验证小节。 |
OnlyLabeled (可选) | 仅列出与标签关联的二进制文件。 |
Num (可选) | 限制返回的二进制文件的数量。二进制文件按日期顺序返回,最新的在前。 |
OutputFile (可选) | 二进制文件列表将作为JSON数组输出到指定文件。 |
如何删除二进制文件
如要删除一个二进制文件,请删除二进制文件的所有标签。二进制文件将在七天后自动删除。
参数说明:
参数名称 | 说明 |
---|---|
OrganizationID | 使用随凭证提供的组织ID字符串。 |
ProductID | 使用随凭证提供的产品ID字符串。 |
ArtifactID | 指定随凭证提供的构件ID字符串。 |
ClientId | 请参阅身份验证小节。 |
ClientSecretEnvVar | 请参阅身份验证小节。 |
BuildVersion | 应标记的二进制文件的版本字符串。此版本的二进制文件必须已经注册,否则标记操作将被拒绝。 |
如何复制二进制文件
CopyBinary 模式允许你在不同构件之间复制二进制文件,而无需重新上传二进制文件。如果你想要将最终二进制文件从Staging构件移至Live构件,此功能很有用。
参数说明:
参数名称 | 说明 |
---|---|
OrganizationID | 使用随凭证提供的组织ID字符串。 |
ProductID | 使用随凭证提供的产品ID字符串。 |
ArtifactID | 指定随凭证提供的构件ID字符串。 |
ClientId | 请参阅身份验证小节。 |
ClientSecretEnvVar | 请参阅身份验证小节。 |
BuildVersion | 应标记的二进制文件的版本字符串。必须已经注册此版本的二进制文件,否则标记操作将被拒绝。 |
SourceArtifactId | 指定从中复制二进制文件的构件ID。 |
DestArtifactId | 指定复制二进制文件的目标构件ID。 |
如何对比二进制文件
DiffBinaries 工具模式将计算已上传的两个二进制文件之间的差异,并输出用于在它们之间应用更新的统计数据。
参数说明:
参数名称 | 说明 |
---|---|
OrganizationID | 使用随凭证提供的组织ID字符串。 |
ProductID | 使用随凭证提供的产品ID字符串。 |
ArtifactID | 指定随凭证提供的构件ID字符串。 |
ClientId | 请参阅身份验证小节。 |
ClientSecretEnvVar | 请参阅身份验证小节。 |
BuildVersionA | 基础二进制图像的版本字符串。 |
BuildVersionB | 要更新二进制图像的版本字符串。 |
InstallTagsA (可选) | 在引号中指定BuildVersionA上使用的一系列安装标签,各个标记之间用逗号分隔。如果你想计算未标记的文件,你应该包含空字符串。省略参数将使用所有文件。InstallTagsA=""将仅是未标记的文件。InstallTagsA=",tag"将是未标记的文件加上用“标签”标记的文件。InstallTagsA="tag"将是仅用“标签”标记的文件。 |
InstallTagsB (可选) | 在引号中指定BuildVersionB上使用的一系列安装标签,各个标记之间用逗号分隔。应用与InstallTagsA相同的规则。 |
CompareTagSet (可选) | 在引号中指定一系列标签,用于计算二进制文件之间的差异统计数据,各个标签之间用逗号分隔。支持多个列表。应用与InstallTagsA相同的规则。 |
OutputFile (可选) | 差异将作为JSON对象输出到指定文件。 |
降低更新大小
需要v1.4.0和更高版本
BuildPatchTool将通用补丁系统用于使用 UploadBinary 模式上传的所有二进制文件。系统允许Epic Games商城将用户机器上二进制文件的任意版本更新为任意其他版本,从而最大限度降低下载大小。
BinaryDeltaOptimise 模式旨在获取已上传到Epic服务的两个二进制文件,并为在这两个特定版本之间更新的用户生成更小的下载。我们将其称为A到B补丁。运行此命令是可选的步骤,鉴于大部分玩家都是使用特定的二进制版本(二进制“A”),发布比平常更大的补丁时,可以执行此步骤来改善用户体验。
下面是用于改善两个二进制版本之间的增量补丁的命令行示例:
参数说明:
参数名称 | 说明 |
---|---|
OrganizationID | 使用随凭证提供的组织ID字符串。 |
ProductID | 使用随凭证提供的产品ID字符串。 |
ArtifactID | 指定随凭证提供的构件ID字符串。 |
ClientId | 请参阅身份验证小节。 |
ClientSecretEnvVar | 请参阅身份验证小节。 |
CloudDir | BuildPatchTool可以保存要上传文件的目录,每次运行时可以为空。与BuildRoot一样,这里可以是绝对路径或相对路径。(此位置用于缓存现有二进制文件的信息,并且应该是不同于BuildRoot参数的目录。此目录可以初始为空,BuildPatchTool会根据需要从Epic后端下载信息,并将其存储在CloudDir中。) |
BuildVersionA | 基础二进制图像的版本字符串。 |
BuildVersionB | 目标二进制图像的版本字符串。 |
DiffAbortThreshold (可选) | 以字节为单位指定,供原始对比尝试提升的上限。这样允许对可能没有优势的大对比进行短路冗长优化尝试。接受的范围是n >= 1GB,默认为永不中止。 |
在 BinaryDeltaOptimise 模式下运行时,BuildPatchTool将从我们的云网络流送现有二进制数据,进行重新分析,然后上传新的A到B特定补丁数据。如果 BuildVersionA
和 BuildVersionB
之间的原始下载大小很大,此过程耗时可能超过标准PatchGeneration模式。
一般建议在运行 BinaryDeltaOptimise 模式时,将当前Live二进制文件用作 BuildVersionA
,将你接下来要发布的二进制文件用作 BuildVersionB
。理想情况下,应规划在发布的几天前完成此过程,以防运行工具时发生问题,如断网。
要检查当前Live二进制文件版本,你可以利用ListBinaries模式。 如果已在两个提供的BuildVersion值之间运行了 BinaryDeltaOptimise ,该过程会成功将操作短路,如输出中所示。
完成处理后,输出将显示实现的改进情况。
- "最终未知压缩字节数,加上元 [Bytes]"
- 这指的是针对
BuildVersionA
和BuildVersionB
之间的补丁实现的新下载大小。
- 这指的是针对
- "原始未知压缩字节数 [Bytes]"
- 这指的是运行优化之前,
BuildVersionA
和BuildVersionB
之间的补丁的下载大小。
- 这指的是运行优化之前,
- "改进:[Percentage]"
- 这将显示实现的改进情况。该百分比指的是缩减幅度,越大越好。
示例输出:
可下载内容(DLC)
Epic Games商城提供了对可下载内容(DLC)的全面支持。对于DLC,BuildPatchTool的操作完全相同,因为它适用于整个游戏,以下是额外注意事项:
DLC的每个项目都将拥有自己唯一的构件ID。相应地,DLC的每个项目都需要各自的补丁生成过程,才能通过指定的合适构件ID执行。由于每个项目会单独生成,在为DLC项目执行补丁生成时,应务必确保基础游戏及所有其他DLC项目不同时出现在补丁生成过程中BuildRoot参数指定的文件夹中。或者,如果BuildRoot文件夹确实包含主游戏或其他DLC项目,则可以在BuildPatchTool命令行上指定-FileIgnoreList参数,在生成的二进制文件中将其排除(有关更多细节,请参阅“如何上传二进制文件”)。
安装在最终用户的机器上时,主游戏和相关DLC的所有项目将安装到同一个目录。这将造成如下限制:主游戏或DLC的所有项目中不得有文件使用相同的文件路径。BuildPatchTool将检查此情况,并且在有文件违反此规则时阻止补丁生成过程发生。这意味着,基础游戏必须能够按相对于安装位置的路径找到安装的DLC。
在短期内,DLC项目的构件ID将由Epic分配给你,并且主游戏和DLC项目之间的关联将作为该过程的一部分提供。从长远来看,我们考虑将此配置合并到开发人员门户上的自助服务操作中。
常见错误的故障排除
开始入门
在排查故障时,请先检查是否有以下潜在错误:
- 检查路径语法 -
BuildRoot="D:\MyFolder\"
- WILL NOT WORK - 确保在所有参数之间添加了空格。
- 版本中包含的文件受Windows MAX_PATH限制(限制为260个字符);如果上传过程意外失败,请确保所有文件路径位置不超过此限制。
- 大多数BuildPatchTool参数通常作为绝对路径或工作目录相对路径提供,但AppLaunch参数必须仅相对于BuildRoot位置提供。
- 随着在同一台机器上处理更多版本,CloudDir内容会随着时间的推移而增加。但是,你可以随时清除此文件夹,而且不会产生负面影响。
常见错误
使用BPT时,请确保你的命令行是精确的。如果你使用的命令不精确,你将收到一条特定的错误消息。
请注意,这些只是常见错误。
错误 - 从Epic服务检索二进制文件列表失败
含义 你所使用的客户端凭证并未授权上传到指定的构件。这可能是由于凭证或其他参数中有拼写错误,或者授予客户端的权限有问题。
错误 - 缺少参数
含义 BPT未检测到上面所列的一个或多个参数。这可能就是因为缺少这些参数,或者未正确添加这些参数。
错误 - 缺少凭证
含义 BPT未检测到上面所列的一个或多个参数。这可能就是因为缺少这些参数,或者未正确添加这些参数。
错误 - 身份验证错误
含义 你所使用的客户端凭证与我们的记录不匹配。这可能是由于凭证或其他参数中有拼写错误,或者授予客户端的权限有问题。
错误 - 意外错误·
含义 你所使用的客户端凭证无权访问你指定的构件。这通常是因为授予客户端的权限发生了问题,服务交付团队可以解决这个问题。
其他检查事项
- 使用的客户端ID和客户端密钥由Epic提供,专供BuildPatchTool使用;EOS客户端ID(通常以xyza开头)不能与BuildPatchTool一起使用
- 提供了所有需要的参数
- 参数没有拼写错误,包括不正确的首字母大小写或空格问题
- 包含空格的参数缺少引号