Документация Steamworks
Загрузка контента в Steam
Ниже вы найдёте руководство по использованию SteamPipe — инструмента Valve для управления контентом в Steam. Подробную информацию и рекомендации по обновлению вашей игры можно найти здесь: Рекомендации по обновлению игр.

Введение в систему управления контентом SteamPipe

SteamPipe — это система управления контентом игр и приложений в Steam. Среди функций SteamPipe:
  • Эффективная и быстрая доставка контента.
  • Публичные и скрытые бета-ветки, которые позволяют тестировать несколько сборок.
  • Простой сайт для управления сборками: публикация и удаление сборок происходит всего в несколько кликов.
  • Возможность видеть размер обновления до публикации сборки.
  • Контент может быть общим для нескольких приложений.
  • Возможность создавать установочные диски из общедоступного и бета-контента.
  • Игры/приложения остаются доступными в офлайн-режиме даже после того, как началась загрузка обновлений.
  • Весь контент всегда зашифрован, а пользователи не видят неактивные версии.
  • Во время разработки может использоваться локальный сервер контента.
Обратите внимание: некоторые понятия являются весьма существенными для понимания функционирования SteamPipe, поэтому перед началом работы вам необходимо ознакомиться со всеми статьями раздела Приложения. Даже если у вас будет самое базовое понимание о том, как эти части связаны в единое целое, это пригодится при отправке вашего продукта в Steam.

Структура игрового контента: рекомендации


SteamPipe позволяет эффективно загружать как начальные установочные файлы игры, так и её обновления. Система поддерживает разнообразные структуры игрового контента. Для максимально эффективной работы ознакомьтесь с некоторыми важными возможностями оптимизации.

Обратите внимание: Если в вашей игре используется Unreal Engine, прочитайте примечания об особенностях пакетных файлов для этого случая в конце данного раздела.

SteamPipe сначала разделяет все файлы на фрагменты размером около 1 МБ, а затем применяет к каждой из них сжатие и шифрование, после чего выгружает их в систему доставки Steam. Они остаются в сжатом и зашифрованном виде до тех пор, пока не будут загружены каждым клиентом Steam, где происходит их расшифровка, распаковка и перемещение в соответствующее место расположения файлов.

При обработке обновлений существующей игры SteamPipe ищет любые фрагменты файлов, которые соответствуют предыдущей сборке. В этом случае только новые и изменённые части файлов будут преобразованы в «новые фрагменты», которые клиенту понадобится загрузить для обновления игры.

Многие игровые движки используют специальные «пакетные» файлы внутриигровых ресурсов: так обеспечивается более эффективный доступ к диску и сокращается время загрузки. В целом, такой подход хорошо работает в SteamPipe. Однако некоторые системы пакетных файлов разрешают сценарии, из-за которых могут возникнуть проблемы. В результате размер файлов обновлений почти всегда оказывается больше чем необходимо. Уменьшая время загрузки, они замедляют процесс обновления, поскольку требуют большого количества операций ввода-вывода на локальном диске.

Если в вашей игре используются пакетные файлы, следуйте приведённым ниже рекомендациям:

  • Убедитесь, что при изменении ресурсов их расположение внутри пакетных файлов по возможности не меняется.
  • Старайтесь не менять порядок ресурсов внутри пакетных файлов.
  • Ограничьте размер пакетного файла.
  • Сгруппируйте ресурсы по уровням/области применения/фунциям в отдельные пакетные файлы, а также по возможности добавляйте новые пакетные файлы для обновлений вместо изменения уже существующих файлов.
  • Не добавляйте первоначальные имена файлов или метки времени файлов/сборок для каждого ресурса.

Первый пункт из списка выше относится к количеству изменений байтов внутри файла при изменении одного ресурса. Лучше всего, чтобы при изменении и/или увеличении либо уменьшении данных в таком ресурсе их расположение внутри пакетного файла не менялось. SteamPipe создаст новые фрагменты для частей файла, в которых содержатся данные ресурсов. При этом для всех пакетных файлов нужен список содержимого в том или ином виде, чтобы движок мог определить место расположения данных. Структура списка содержимого в большой степени определяет эффективность обновления через SteamPipe. В идеале список содержимого, в том числе представленный в виде дерева, располагается в начале или в конце файла. Так как другие ресурсы могут менять позиции байтов внутри файла, их расположение в списке содержимого тоже будет меняться. В этом случае SteamPipe создаст новые фрагменты для изменённых данных в ресурсах, а также для изменений списка содержимого.

Однако мы заметили, что в некоторых игровых движках список содержимого может быть распределён по всему файлу. Или в нём могут использоваться абсолютные значения смещения байтов. Получается, что если ресурс, расположенный на байте 3450, увеличивается на 8 байтов, значения сдвигов для всех ресурсов в этом файле изменятся. Хотя значение каждого смещения будет иметь размер 4 или 8 байтов, изменение восьмибайтного числа приведёт к созданию в SteamPipe нового фрагмента размером 1 МБ. В результате может оказаться, что даже при небольших изменениях ресурсов внутри пакетного файла клиентам придётся скачивать более половины всего файла для обновления. Если вы считаете, что структура вашего пакетного файла может стать причиной подобных проблем, свяжитесь с представителем Valve как можно скорее. Мы можем предложить альтернативный алгоритм сборки, который является компромиссным решением для таких случаев.

У SteamPipe нет информации о границах ресурсов внутри пакетного файла. Если ресурсы размером меньше 1 МБ перемешиваются, скорее всего, SteamPipe не выявит изменений в порядке их следования, так как в файле больше не будет определённых ранее фрагментов размера 1 МБ. Поэтому если во время создания обновления для игры вы хотите оптимизировать время загрузки, изменив порядок ресурсов внутри пакетного файла, имейте в виду, что это может значительно увеличить размер загружаемого обновления. Мы рекомендуем прибегать к этому способу, только если это существенно улучшит производительность.

Чтобы обновить пакетный файл на устройстве, SteamPipe собирает новую версию одновременно со старой. Когда новые файлы созданы, происходит «применение» обновления: старые файлы удаляются, а новые — добавляются. Это означает, что для обновления пакетного файла размером 25 ГБ SteamPipe всегда создаёт новый файл такого же размера. Если обновление состоит в изменении 10 байтов этого файла, SteamPipe скопирует почти все 25 ГБ из старого файла в новый. В зависимости от оборудования клиента это может происходить довольно медленно. Поэтому мы рекомендуем выполнить следующие действия.

Во-первых, следует ограничить размер пакетных файлов. Скорее всего, одного или двух ГБ будет достаточно для эффективного чтения диска при загрузке игры.

Во-вторых, стоит по возможности ограничить количество ресурсов внутри каждого отдельно взятого пакетного файла. Это может быть один уровень игры или разблокированная функция. Таким образом, для обновления определённых частей игры не понадобится копировать все данные игры на компьютер пользователя. Кроме того, при добавлении новых функций, уровней и т. д. стоит размещать их в отдельных новых пакетных файлах. Такие обновления потребуют загрузки только новых файлов, и при этом не возникнет описанных выше проблем, связанных с изменениями пакетных файлов.

Если сомневаетесь, воспользуйтесь локальной утилитой сравнения файлов, например Beyond Compare, чтобы проверить разные версии пакетных файлов. Убедитесь, что отличия соответствуют ожидаемым размерам изменённых ресурсов и в файле нет десятков или сотен мелких изменений. Если вы обнаружите несоответствия, проверьте настройки вашего упаковщика файлов.

Сжатие. Так как Steam сжимает все файлы для отправки/хранения/загрузки, мы не рекомендуем сжимать пакетные файлы другими способами. Однако если вас беспокоит размер игры на диске, вы всё равно можете применить сжатие к пакетному файлу. Это не вызовет проблем в работе SteamPipe, если выполнены описанные выше условия. В частности, стоит убедиться, что сжатие применяется непосредственно к каждому ресурсу, насколько это возможно. Любое сжатие, выходящее за рамки ресурсов, приведёт к изменениям, из-за которых клиентам потребуется загружать больше данных чем необходимо.

Шифрование. Аналогично сжатию — скорее всего, не является необходимым и несёт в себе те же риски.

Следование этим рекомендациям поможет минимизировать размер файлов обновлений и потребует загрузки только нового контента. Пользователям будет удобнее, а вы сможете предлагать обновления чаще, улучшая таким образом качество вашего продукта.

Если вы считаете, что при взаимодействии вашей системы игровых файлов и процесса обновления в SteamPipe возникают проблемы совместимости, обратитесь к представителю Valve. Мы можем включить дополнительные функции, чтобы вам помочь.

Unreal Engine: примечания

Некоторые версии Unreal Engine используют выравнивание (padding alignment) ресурсов в пакетных файлах, что может значительно повлиять на размер обновлений в SteamPipe. В результате такого выравнивания при сборке новых версий происходят каскадные смещения ресурсов, особенно если дополнительно включено сжатие пакетного файла. Выравнивание (padding alignment) размером 1 Мбайт (1 048 576 байтов) гарантирует, что при повторном выравнивании значение смещения ресурсов будет кратно размеру блока, который используется для вычислений дельты в SteamPipe.

Например, чтобы определить или изменить выравнивание при подготовке пакетных файлов игры, вам понадобится внести правки в одну строку в файле UnrealEngine/Engine/Source/Programs/AutomationTool/Win/WinPlatform.Automation.cs. Найдите в нём функцию GetPlatformPakCommandLine, а затем измените в ней строку:

string PakParams = " -patchpaddingalign=2048";

следующим образом:

string PakParams = " -patchpaddingalign=1048576 -blocksize=1048576";

Это позволит включить сжатие для пакетного файла и одновременно оптимизировать работу SteamPipe при обновлениях.

Unreal Engine является товарным знаком и/или зарегистрированным товарным знаком компании Epic в США и других странах.

Видеоурок Steamworks: создание игры в SteamPipe

В этом видеоуроке вы найдёте описание SteamPipe и основных этапов создания приложения для Steam с помощью инструментов Steamworks.
https://www.youtube.com/watch?v=SoNH-v6aU9Q

Видеоурок Steamworks: добавление новых платформ и языков

В этом видеоуроке рассказано, как добавить новые платформы и языки в игру с помощью создания новых хранилищ в приложении.
https://www.youtube.com/watch?v=PShS32hcing

Техническое описание SteamPipe

SteamPipe использует протокол HTTP для доставки контента. Поскольку любые загрузки — это обычный интернет-трафик, стороннее кэширование HTTP между пользователем и серверами Steam увеличит скорость загрузки. Контент может поставляться от внешних CDN-провайдеров, которые легко добавить в нашу сеть. Большинство пользовательских брандмауэров разрешают HTTP-трафик и не будут блокировать загрузки.

SteamPipe предлагает эффективный алгоритм обновлений, основанный на бинарных дельтах, при использовании которого обновляются только изменённые части существующих файлов контента. Когда контент обновляется, происходит отправка только этих дельт. Это означает, что и разработчику, и пользователю понадобится передавать меньше данных, а сама передача будет быстрее. Многие партнёры решают не использовать Локальный сервер контента SteamPipe, так как сборки можно эффективно обновлять в скрытых ветках.

Аккаунт Steam для сборок

Для того чтобы начать создавать сборки в Steam, вам понадобится аккаунт Steam в аккаунте Steamworks с разрешениями «Изменение метаданных приложения» и «Публикация изменений в Steam». Из соображений безопасности мы рекомендуем иметь специальный аккаунт для сборок только с этими разрешениями. Вы можете создать новый аккаунт Steam здесь: https://store.steampowered.com/join.

Любой администратор вашего аккаунта Steamworks может добавить аккаунт Steam и предоставить ему необходимые разрешения. Подробнее об этом можно прочитать в документации «Управление аккаунтом Steamworks». Пример такого аккаунта:

create_build_account.png
Обратите внимание: если вам понадобится опубликовать сборку для выпущенного приложения, к соответствующему аккаунту нужно будет привязать номер телефона или мобильное приложение Steam. Они будут использоваться, чтобы подтвердить публикацию сборки для выпущенного приложения. Кроме того, в случае внесения в аккаунт изменений, связанных с безопасностью (новая эл. почта, номер телефона и т. п.), вы сможете осуществить публикацию только через три дня. Это ограничение нужно, чтобы злоумышленники не могли управлять сборками вашего приложения со взломанного аккаунта.

Начальная настройка новых приложений SteamPipe

Чтобы настроить новые приложения SteamPipe, выполните следующие действия:
  1. Найдите номер приложения (App ID, его можно узнать, выбрав приложение на главной странице Steamworks)
  2. Перейдите в раздел «Общие параметры установки» вашего приложения.
  3. Создайте как минимум один вариант запуска (путь и, опционально, условия, требуемые для запуска игры). Наведите на значок «(?)», чтобы узнать больше о каждом параметре.

    В примере ниже показаны пять вариантов запуска: два для Windows, два для macOS и один для Linux.

    Третий вариант запуска будет отображаться на Windows, только если у пользователя есть указанный доп. контент (DLC).

    updatedlaunchoptions_3.png
  4. Перейдите в раздел «Хранилища» и добавьте необходимые приложению хранилища. Одно хранилище может быть уже настроено по умолчанию.
    1. Нажмите на название хранилища, чтобы его отредактировать. Выберите подходящее узнаваемое название (к примеру, Base Game Content или Windows Content).
    2. Оставьте параметр [Все языки], кроме случаев, когда хранилище относится только к определённому языку.
    3. Оставьте параметр [Все ОС], кроме случаев, когда это хранилище относится к той или иной операционной системе (если приложение запускается на всех ОС, либо только на ПК, либо только на Mac, оставьте [Все ОС]). Этот параметр можно изменять, только если хранилище относится к той или иной операционной системе.
    4. Для добавления нового хранилища нажмите соответствующую кнопку.
    5. Нажмите «Сохранить» для сохранения изменений.
  5. Как только вы закончите редактировать хранилища, опубликуйте изменения в соответствующем разделе.
  6. Свежеотредактированные хранилища необходимо включить в соответствующий комплект, которым вы владеете. У каждой игры есть комплект разработчика Developer Comp, который автоматически передаётся аккаунтам, перечисленным в издательской группе.
    Вы можете добавить новые хранилища в этот и другие комплекты в разделе «Связанные комплекты и дополнительный контент».
Примечание: если исполняемый файл находится в подпапке внутри основной папки установки, добавьте имя этой вложенной папки в поле «Исполняемый файл». Не используйте косую черту (/) в начале или точки.
Примечание о платформах: Как следует из описания выше, для запуска macOS-приложений можно указать комплект приложения (Game.app) или скрипт/бинарный файл (Game.app/Contents/MacOS/Game). По возможности следует использовать формат комплекта приложения, поскольку он позволяет macOS точнее определять параметры запуска, как если бы приложение было запущено вручную вне Steam.

Стоит отметить, что сейчас при запуске через комплект приложения на устройствах с Apple Silicon будет выбран наиболее подходящий вариант архитектуры, тогда как при запуске через бинарный файл будет использоваться архитектура процесса Steam (на данный момент — x86_64).

Настройка SDK для загрузок в SteamPipe

Загрузите и распакуйте последнюю версию Steamworks SDK на компьютер, который вы планируете использовать для загрузки сборок.

Инструменты SteamPipe находятся в двух подпапках папки tools внутри SDK.

Папка ContentBuilder предназначена для контента вашей игры и инструментов SteamPipe для сборки. В ней есть следующие подпапки:
  • builder — изначально содержит только steamcmd.exe, т.е. консольный клиент Steam.
  • builder_linux — SteamCMD для Linux.
  • builder_osx — SteamCMD для macOS.
  • content — здесь хранятся все файлы игры, которые затем будут собраны в хранилища.
  • output — эта папка будет содержать журналы сборок, блоки кэша и промежуточный вывод. ПРИМЕЧАНИЕ: эту папку или её содержимое можно удалить в любой момент, но после этого время следующей отправки увеличится.
  • scripts — сюда следует поместить все сценарии сборок для хранилищ игры.
steampipebuilddir.png

Рекомендуется один раз запустить steamcmd.exe прямо из папки инструмента сборок для соответствующей платформы, чтобы инициировать создание вашей системы сборок. Таким образом, в папке вашего инструмента сборок появятся все необходимые для создания хранилищ файлы.

В папке ContentServer содержатся инструменты, которые позволят при необходимости запустить собственный Локальный сервер контента SteamPipe.

SteamCmd на macOS

Чтобы включить SteamCmd на macOS, необходимо выполнить следующие действия:
  1. Откройте папку tools\ContentBuilder\builder_osx в Терминале.
  2. Выполните команду chmod +x steamcmd
  3. Введите bash ./steamcmd.sh.
  4. SteamCmd запустится и обновится до последней версии, после чего вы увидите командную строку SteamCmd.
  5. Введите exit и нажмите кнопку Enter, чтобы закрыть командную строку.
Вы можете следовать приведённым далее рекомендациям (меняя пути соответствующим образом), чтобы создать хранилище и файлы конфигурации приложения для загрузки контента в Steam.

Создание файлов настроек сборки в SteamPipe

Для загрузки файлов приложения с помощью SteamPipe вам потребуется создать скрипты с описанием сборки и каждого хранилища, которое в ней находится. Ниже приведены примеры скриптов в папке Tools\ContentBuilder\scripts в Steamworks SDK.

Графический интерфейс SteamPipe

Если вы работаете на Windows и хотите создавать файлы настроек и загружать ваши сборки с помощью графического интерфейса, вы можете воспользоваться SteamPipeGUI из папки инструментов Steamworks SDK. В архив дополнительно включены инструкции о его работе.

Даже если вы решите использовать графический интерфейс, рекомендуем ознакомиться со следующими разделами документации, чтобы лучше понимать, как работает система SteamPipe.

Простой скрипт сборки


Для начала рассмотрим самый простой скрипт. Пусть, к примеру, у игры (AppID 1000) есть одно хранилище (DepotID 1001) и требуется загрузить все файлы из папки контента и её подпапок. Для этого нужен один скрипт сборки. Можно использовать "simple_app_build.vdf", включённый в SDK:

"AppBuild" { "AppID" "1000" // ваш AppID "Desc" "Это пример скрипта сборки" // внутреннее описание сборки "ContentRoot" "..\content\" // корневой каталог контента, относительный путь к файлу "BuildOutput" "..\output\" // папка вывода сборки, предназначенная для файлов журналов и кэша сборки "Depots" { "1001" // ваш идентификатор хранилища DepotID { "FileMapping" { "LocalPath" "*" // все файлы из папки contentroot "DepotPath" "." // указывает на корень хранилища "recursive" "1" // включает все подпапки } } } }

Измените значения AppID и DepotID, чтобы они соответствовали вашей игре. Чтобы начать процесс сборки, запустите SteamCMD и передайте несколько параметров:
tools\ContentBuilder\builder\steamcmd.exe +login <account_name> <password> +run_app_build ..\scripts\simple_app_build.vdf +quit

При сборке в SteamPipe выполняются следующие шаги:
  1. Происходит обновление steamcmd.exe до последней версии.
  2. Steamcmd.exe заходит на внутренний сервер Steam с помощью указанного аккаунта Steam для сборки.
  3. Начало сборки приложения регистрируется на главном сервере хранилищ (MDS), который проверяет разрешения пользователя на изменения этого приложения.
  4. Для каждого хранилища, включённого в сборку, создаётся список файлов из папки контента, отфильтрованных в соответствии с критериями, которые были заданы в файле настроек сборки хранилищ.
  5. Каждый файл сканируется и разделяется на небольшие фрагменты размером около 1 МБ. Если сборка хранилища уже выполнялась, в процессе разделения будут по возможности сохранены все неизменённые фрагменты.
  6. Новые фрагменты файлов сжимаются, зашифровываются, а затем выгружаются на главный сервер хранилищ MDS.
  7. Для данной версии хранилища создаётся финальный файл манифеста. Каждому манифесту присваивается уникальный 64-битный идентификатор.
  8. После обработки всех хранилищ главный сервер MDS завершает сборку приложения и присваивает ей глобальный идентификатор BuildID.
  9. После окончания процесса сборки в папке вывода могут находиться файлы *.csm и *.csd. Эти файлы — временные, их можно удалить, однако они ускорят следующие сборки.


Завершённая сборка появится на странице сборок приложения, в описанном примере это https://partner.steamgames.com/apps/builds/1000. Там же вы сможете опубликовать эту сборку в ветке по умолчанию или в одной из бета-веток, и через несколько минут обновление будет доступно пользователям для загрузки.

Расширенные скрипты сборок


Если ваше приложение содержит много хранилищ со сложной системой сопоставления файлов, вы можете создать скрипт сборки для каждого хранилища, на которое будет ссылаться скрипт сборки приложения. В скрипте сборки приложения могут использоваться следующие параметры:

  • AppID — AppID вашей игры. Партнёрский аккаунт, с помощью которого будут осуществляться загрузки в Steam, должен иметь разрешение на изменение метаданных приложения.
  • Desc — описание, которое видно только вам в разделе сборок на странице управления приложением. Его можно изменить в любой момент после загрузки сборки на странице всех ваших сборок.
  • ContentRoot — корневой каталог файлов вашей игры. Можно указать абсолютный путь или путь относительно файла скрипта сборки.
  • BuildOutput — здесь будут расположены файлы журналов сборки, манифесты хранилищ, блоки кэша и промежуточный вывод. Чтобы улучшить производительность, рекомендуется использовать отдельный диск для вывода сборки. В этом случае нагрузка на диск распределяется: корневой диск контента обрабатывает запросы на чтение, а диск вывода — запросы на запись.
  • Preview — тип сборки, при котором в папке вывода создаются только журналы вывода и файл манифеста. С помощью предпросмотра сборок можно проверить корректность работы загрузочных скриптов, сопоставления файлов, а также применения фильтров и свойств.
  • Local — укажите здесь htdocs-путь к локальному серверу контента (LCS). При сборке на LCS контент будет размещён только на вашем HTTP-сервере, и вы сможете протестировать установку игры с помощью клиента Steam.
  • SetLive — название бета-ветки, которая будет опубликована автоматически после успешного завершения сборки. Если название не указано, публикации не будет. Обратите внимание, что для автоматической публикации нельзя выбрать ветку по умолчанию. Её публикация осуществляется только в разделе управления приложением.
  • Depots— здесь содержатся сопоставления файлов, фильтры и свойства хранилищ либо ссылки на отдельные файлы скриптов для каждого из них.

В примере скрипта сборки приложения app_build_1000.vdf используются все описанные параметры:
"AppBuild" { "AppID" "1000" // ваш AppID "Desc" "Описание сборки" // внутреннее описание сборки "Preview" "1" // только предпросмотр сборки, без загрузки "Local" "..\..\ContentServer\htdocs" // поместить контент на локальный сервер вместо загрузки в Steam "SetLive" "AlphaTest" // опубликовать эту сборку в бета-ветке "ContentRoot" "..\content\" // папка вывода для сборки, относительный путь к этому файлу скрипта "BuildOutput" "D:\build_output\" // кэш сборки и файлы журналов следует помещать на другой диск для улучшения производительности "Depots" { // инструкции по сопоставлению файлов для каждого хранилища находятся в отдельных файлах скриптов "1001" "depot_build_1001.vdf" "1002" "depot_build_1002.vdf" } }

В этом скрипте указаны два файла скриптов сборки хранилищ — в них заданы сопоставления и свойства файлов. В скрипте сборки хранилищ (или в соответствующем разделе скрипта сборки приложения) доступны следующие настройки:

  • DepotID — идентификатор хранилища в этом разделе.
  • ContentRoot — позволяет на уровне хранилища заменять папку ContentRoot из скрипта сборки приложения.
  • FileMapping — сопоставляет один или несколько файлов из корневого каталога контента с вашим хранилищем. Сопоставлений, которые добавляют файлы в хранилище, может быть несколько. Параметр LocalPath представляет собой относительный путь к корневому каталогу контента и может включать подстановочные знаки, например «?» или «*». Он будет также применяться к соответствующим подпапкам, если указан параметр Recursive. Параметр DepotPath задаёт местоположение выбранных файлов в хранилище (укажите «.», если сопоставление не требуется).
  • FileExclusion — повторно исключает файлы из сопоставления и может содержать подстановочные знаки, такие как «?» или «*».
  • InstallScript — помечает файл в качестве скрипта установки и регистрирует его в процессе сборки. Клиент Steam может запускать такие файлы для всех приложений, которые подключают это хранилище.
  • FileProperties — помечает файл следующим образом:
    • userconfig — файл, изменения в который вносит пользователь или сама игра. Его нельзя перезаписать в результате обновления, а в случае его отличия от предыдущей версии не произойдёт ошибки аутентификации.
    • versionedconfig — похоже на userconfig, но если файл будет изменён в хранилище, он будет локально перезаписан при обновлении игры у пользователя. Важно учитывать, что обновлять файл в хранилище следует только в случае важных изменений формата или исправления ошибок.

Пример скрипта сборки хранилища depot_build_1002.vdf со всеми описанными параметрами:
"DepotBuild" { "DepotID" "1002" "ContentRoot" "C:\content\depot1002" // заменяет ContentRoot из скрипта сборки приложения "FileMapping" { // все исходные файлы и папки в ".\bin" будут сопоставлены с папкой ".\executables" в хранилище "LocalPath" "bin\*" "DepotPath" "executables\" "Recursive" "1" // включает все подпапки } "FileMapping" { // заменяет аудиофайлы в \\audio на версии для немецкого языка "LocalPath" "localization\german\audio\*" "DepotPath" "audio\" } "FileMapping" { // копирует скрипт установки для немецкой версии в корневой каталог хранилища "LocalPath" "localization\german\german_installscript.vdf" "DepotPath" "." } "FileExclusion" "bin\server.exe" // исключает этот файл "FileExclusion" "*.pdb" // исключает все файлы .PDB независимо от их местоположения "FileExclusion" "bin\tools*" // исключает все файлы в bin\tools\ "InstallScript" "localization\german\german_installscript.vdf" "FileProperties" { "LocalPath" "bin\setup.cfg" "Attributes" "userconfig" // этот файл будет изменён во время выполнения } }

Обратите внимание: названия скриптов могут быть любыми, но мы используем app_build_<AppID> и depot_build_<DepotID> для единообразия. Если вы уверены, что будете создавать сборки приложений на определённом компьютере, вы можете заранее добавить подпапки в папках скриптов для каждого приложения. Это поможет лучше организовать скрипты сборки каждого приложения.

Использование SteamPipe в среде CI/CD


Для работы SteamCMD в среде непрерывной интеграции или на компьютерах и виртуальных машинах, образ которых часто меняется, понадобится добавить файл настроек, содержащий токен входа. Чтобы сохранить токен при первом входе в систему, следуйте инструкциям:

  1. Выполните команду steamcmd.exe +login <username> на компьютере, где будет запускаться сборка.
  2. Введите пароль и токен SteamGuard.
  3. Введите info. Ваш аккаунт должен отобразиться в списке как подключённый.
  4. Введите quit.
  5. При следующих запусках не вводите пароль и просто выполните команду steamcmd.exe +login <username>.
  6. Убедитесь, что файл настроек <Steam>\config\config.vdf был сохранён и не менялся между запусками, так как он мог обновиться после успешного входа.

Обратите внимание: если при очередном входе ввести пароль, будет создан новый токен SteamGuard и для него потребуется повторная верификация.

Управление обновлениями

После выпуска приложения пользователи будут получать сборку, помеченную как сборка по умолчанию. Новые сборки рекомендуется тестировать перед отправкой пользователям. Подробнее об этом можно прочитать здесь.

Отладка сборки

Если сборка прошла с ошибками, проверьте информацию о них в папке вывода (но не в консоли, где запускался скрипт сборки). Основные данные об ошибках находятся в файлах *.log.
Для отладки вы можете использовать следующие команды и файлы клиента Steam:
  • "app_status [appid]" — показывает текущее состояние приложения на клиенте.
  • "app_info_print [appid]" — показывает текущие настройки игры в Steamworks (хранилища, варианты запуска и проч.).
  • "app_config_print [appid]" — показывает текущие пользовательские настройки приложения (язык, папка установки и проч.).
  • file "logs\content_log.txt" — выдаёт список всех выполненных операций и ошибок в SteamPipe.
  • file "steamapps\appmanifest_[appid].acf" — показывает текущее состояние приложения (KeyValues).

Сборки для создания установочных дисков

Чтобы создать установочные диски для игр в SteamPipe, сначала вам потребуется настроить файл проекта сборки.
В данном примере файл SKU называется "sku_goldmaster.txt":
"sku" { "name" "Test Game Installer" "appid" "202930" "disk_size_mb" "640" "included_depots" { "1" "202931" "2" "202932" } }
Важно учитывать следующее:
  • Создайте новую папку, где будут записаны образы дисков, к примеру, "D:\retail_disks". Добавляться будут только хранилища, включённые в папку included_depots, без исключений.
  • Для сборки образов установочных дисков вы можете использовать steam.exe (с параметрами командной строки -dev и -console) или steamcmd.exe. В обоих случаях используется команда build_installer.
  • Войдите в аккаунт Steam, который владеет игрой и всеми хранилищами для записи на розничный диск. Аккаунту не требуются другие специальные права, так что создавать установочные диски может кто угодно.
  • Если вы используете Steam.exe, остановите все загрузки.
  • Перейдите в консоль и запустите команду build_installer:
    build_installer sku_goldmaster.txt "D:\retail_disks"
    Сборка может занять некоторое время, поскольку все хранилища загружаются заново.
  • Если вы создаёте «золотой» мастер-диск, используя локальный сервер контента, выполните данную команду:
    @localcontentserver "webserver"
    build_installer sku_goldmaster.txt "D:\retail_disks" local
    Вы увидите сообщение о резервной копии, поскольку розничный установочный диск и локальная резервная копия — это почти одно и то же.
  • Как только вы увидите сообщение о том, что создание резервной копии завершено ("Backup finished for AppID..."), образы установочных дисков готовы. Дополнительная информация о созданной резервной копии будет доступна в файле logs\backup_log.txt.
  • В "D:\retail_disks" будут созданы новые папки (Disk_1, Disk_2 и т. д.), каждая не больше 640 Мб, что было задано с помощью параметра disk_size_mb. Каждая папка содержит файл sku.sis, а также .csd и .csm для каждого хранилища. Хранилища большего размера записываются на несколько дисков. Контент розничных установочных дисков всегда шифруется (в отличие от локальных файлов резервных копий). Скопируйте SDK-файлы настройки «золотого» мастер-диска (setup.exe, setup.ini и др.) в папку первого диска, и розничные диски установки готовы.
  • При создании «золотого» мастер-диска для macOS убедитесь, что у вас открыт образ диска goldmaster/disk_assets/SteamRetailInstaller.dmg на Mac. Затем скопируйте приложение оттуда в корневой каталог носителя. Вам, вероятно, захочется переименовать приложение, создать собственную иконку и сделать так, чтобы окно показывало только установщик.
  • При создании мастер-дисков многодисковой игры для macOS убедитесь, что названия томов для каждого диска совпадают. Название тома становится частью пути подключения, и если названия не совпадают, установщик не распознает следующий диск.

Создание розничного диска с помощью бета-ветки

В описании выше сборка осуществлялась на основе ветки по умолчанию. Чтобы использовать бета-ветку, вам сначала потребуется создать бета-ветку с названием baseline. Затем запустите сборку на основе ветки baseline с помощью следующей команды:
build_installer <project file> <target folder> <beta key> <beta pwd> пример команды для steamcmd: build_installer sku_goldmaster.txt "D:\retail_disks" baseline superSecret пример команды для срипта: steamcmd.exe +login user_name password +build_installer "..\Build\GameDataSku.txt" c:\destination beta_key beta_password +exit

Установка доп. контента с розничного диска

В некоторых ситуациях вам может понадобиться создать розничный диск, который включал бы дополнительный контент (DLC). Для этого в процесс создания установочного диска потребуется внести всего несколько изменений.
Добавьте номера AppID всех DLC в разделе included_depots файла sku_goldmaster.txt. После выполнения команды build_installer найдите созданный файл установщика sku.sis и откройте его в текстовом редакторе.
Укажите AppID всех DLC в разделе apps. Например, для игры с AppID 1000 и доп. контента с AppID 1010 раздел apps понадобится изменить следующим образом:
"apps" { "0" "1000" "1" "1010" }
Таким образом, Steam проверит права владения доп. контентом и запросит у пользователя ключ, если DLC не принадлежит аккаунту, который использовался для входа в Steam.

Создание одного установочного диска/комплекта для нескольких приложений

Для создания «золотого» мастер-диска с несколькими приложениями SteamPipe соберите по очереди установщики каждого приложения, указав одну и ту же папку вывода. Каждая сборка объединится с уже существующим образом установочного диска.

Настройка розничного установочного диска

Подробную информацию об изменении настроек розничного установочного диска можно найти здесь.

Предзагрузка игр перед выпуском

По умолчанию контент шифруется на всех розничных дисках и серверах. В режиме предзагрузки владельцы игры смогут загрузить контент, но он останется зашифрованным для пользователей и не будет доступен для игры. Как только игра выйдет официально, Steam расшифрует загруженный контент и пользователи смогут в неё играть.

Режим предзагрузки игры рекомендуется в следующих случаях:
  • При отправке розничных дисков с ключами продукта до её выпуска (пиратство нулевого дня).
  • Для игр, у которых есть предзаказ, и их размер больше 20 Гбайт.

Обратитесь в издательский отдел Steam, если считаете, что для вашей игры необходима предзагрузка.

Создание доп. контента

Дополнительный контент создаётся как хранилище основной игры. Дополнительная информация доступна в разделе Дополнительный контент (DLC).

Устранение неполадок SteamPipe

"Login Failure: Account Login Denied Failed" при входе через SteamCMD

Причина: скорее всего, SteamGuard не позволяет войти в аккаунт. Решение:
  • Проверьте электронную почту, связанную с аккаунтом, с помощью которого вы пытаетесь войти, и найдите письмо от службы поддержки Steam. Скопируйте код из письма.
  • В SteamCMD выполните команду: set_steam_guard_code <code>
  • Попробуйте войти снова через steamcmd: Steam>login <buildaccount> <password>

Устранение неполадок при проблемах с загрузкой

  • Перезагрузите компьютер, модем, роутер и т. д.
  • Проверьте настройки брандмауэра. Новая система требует для работы порт 80 (HTTP), а также другие порты, указанные здесь.
  • Временно отключите локальные антивирусные и блокирующие спам программы.
  • Проверьте регион загрузки Steam: Настройки -> Загрузки. Он должен совпадать с вашим местонахождением.
  • Остановите загрузку, удалите и переустановите игру (очистите кэши манифестов).
  • Выйдите из Steam, затем удалите папки appcache и depotcache из папки установки Steam.
  • Попробуйте изменить регион загрузки на более отдалённый от вас. Это может сработать, если ближайший к вам сервер отправляет неверные данные.

Сборки для Mac и/или Linux не устанавливают файлы. Почему?

При тестировании установки вашей игры или приложения на различные ОС через Steam может возникнуть ситуация, когда сборка запускается на Windows, но ни один файл не запускается на Mac или Linux, хотя в SteamPipe настроена загрузка хранилищ на этих системах. Здесь важен дополнительный этап, который часто пропускается и состоит в добавлении альтернативных хранилищ в комплект для запуска. Чтобы проверить, какие хранилища включены в комплект, выполните следующие действия:
  1. Откройте раздел управления приложением.
  2. В разделе «Связанные пункты» выберите «Все связанные комплекты, инструменты, демоверсии и дополнительный контент».
  3. Нажмите на название комплекта, которые вы пытаетесь скачать.
  4. Проверьте раздел «Включённые хранилища».
  5. С помощью кнопки «Добавить/удалить хранилища» выберите хранилища, которые должны быть в данном комплекте.
Дополнительную информацию об этом можно найти в обсуждениях:

Запуск steamcmd.exe приводит к следующей ошибке: "SteamUpdater: Error: Steam needs to be online to update. Please confirm your network connection and try again." (Ошибка: для обновления Steam должен быть онлайн. Проверьте ваше подключение к сети и повторите попытку.)

Решение: найдите и включите опцию автоматического определения параметров в настройках вашего интернет-соединения.

Запуск сборки приложения вызывает следующую ошибку: "ERROR! Failed 'DepotBuild for scriptname.vdf' - status = 6."

Возможные причины:
  • У аккаунта нет необходимых разрешений для приложения.
    • Проверьте, что в app_build.vdf указан корректный номер приложения.
    • Проверьте, что у используемого для сборки аккаунта правильно настроены разрешения для данного приложения.
  • SteamCMD не находит содержимое хранилищ.
    • Убедитесь, что значение contentroot в скрипте app_build является правильным путём относительно файла скрипта.
    • Убедитесь, что значение LocalPath в скрипте depot_build является правильным путём относительно скрипта app_build. Проверьте, что контент действительно располагается в указанной папке.

Запуск сборки приложения вызывает следующую ошибку: "ERROR! Failed to get application info for app NNNNN (check login and subscription)"

Это означает, что Steam не может найти информацию о приложении, потому что его не существует либо у пользователя нет к нему доступа.
  • Убедитесь, что NNNNN — это номер, назначенный вашему приложению.
  • Убедитесь, что в app_build.vdf указан корректный номер приложения.
  • Если это новый номер приложения (AppID), проверьте, что настройки управления приложением опубликованы в Steamworks. У всех новых приложений должна быть папка установки SteamPipe и хранилище. Проверить это можно на странице настроек приложения: папка установки указывается в разделе «Общие параметры установки» во вкладке «Установка», хранилища — в разделе «Хранилища» во вкладке «SteamPipe». Опубликовать изменения можно через вкладку публикации.
  • Если всё настроено правильно, убедитесь, что ваш аккаунт владеет данным номером приложения.

"An error occurred while installing [название приложения] (Invalid content configuration)" во время запуска

Возможные причины:
  • В ветке, которую вы пытаетесь установить, нет опубликованных сборок.
    Решение: опубликуйте сборку в ветке, перейдя по ссылке https://partner.steamgames.com/apps/builds/<YourGameAppId>, и выберите эту ветку в клиенте Steam (как это описано здесь).
  • Неверные варианты запуска игры.
    Решение: проверьте варианты запуска во вкладке «Установка», перейдя по ссылке https://partner.steamgames.com/apps/config/<AppID вашей игры>.
  • Вы не владеете хранилищами, которые входят в игру.
    Решение: убедитесь, что необходимые хранилища добавлены в комплект разработчиков (см. Редактирование комплектов).

Я не помню, какая команда использовалась в SteamCMD или как она работает

Все команды SteamCMD можно найти с помощью команды find. Она найдёт частичное совпадение для названия команды, а также её синтаксис.
Steam>find build_installer ConVars: Commands: build_installer : <project file> <target folder> <beta key> <beta pwd>