Documentación de Steamworks
Carga de datos en Steam
A continuación se muestra una guía para usar SteamPipe, la herramienta de Valve para proporcionar contenido a Steam. Para obtener más información sobre prácticas recomendadas para actualizar tu juego, consulta Actualización de tu juego: Prácticas recomendadas.

Introducción al sistema de contenido SteamPipe

SteamPipe es el sistema de contenidos para juegos o aplicaciones que usa Steam. SteamPipe incluye las siguientes características:
  • Aporte eficiente y rápido de contenidos.
  • Ramas "beta" públicas y privadas, permitiendo la prueba de múltiples compilaciones.
  • Gestión sencilla de compilaciones a través de la red: publica una nueva compilación o revierte la actual a una anterior solo con algunos clics.
  • Capacidad para consultar el tamaño actualizado de una compilación antes de activarla.
  • Capacidad de compartir contenido entre múltiples aplicaciones.
  • Capacidad para build installer discs desde contenido público o beta.
  • Los juegos o aplicaciones permanecen disponibles fuera de línea, incluso después de que se haya iniciado la descarga de una actualización.
  • Todo el contenido está siempre cifrado, y las versiones no activas no están visibles para los clientes.
  • Un Servidor de contenido local SteamPipe que puede usarse durante el desarrollo.
NOTA. Hay algunos conceptos que son parte integral de SteamPipe. Antes de comenzar, debes estar familiarizado con todos los conceptos descritos en la documentación Aplicaciones. Tener un conocimiento, aunque sea básico, de cómo encajan estas piezas será muy útil a la hora de subir tu producto a Steam.

Estructura del contenido del juego - Prácticas recomendadas


SteamPipe se diseñó para agilizar tanto las descargas de las instalaciones iniciales de juegos como los parches de actualización. En general, funciona bien para una amplia gama de tipos de contenido. Sin embargo, hay varios factores importantes a considerar en relación con la optimización y a la hora de evitar situaciones que pueden causar problemas de eficiencia.

Nota: Si tu juego utiliza Unreal Engine, echa un vistazo a las notas específicas a estos archivos de paquete al final de esta sección.

SteamPipe inicialemente divide cada archivo en segmentos de aproximadamente un megabyte (MB). Cada segmento se comprime y se cifra antes de cargarse en el sistema de distribución de contenido de Steam. Esos segmentos permanecen cifrados y comprimidos hasta que los descarga el cliente, en ese momento se descifran y se descomprimen, y se colocan en la ubicación o ubicaciones de archivo correspondientes.

Cuando SteamPipe procesa una actualización para un juego existente, busca los segmentos que coincidan con la compilación anterior del juego. De esa forma, idealmente solo se convierten en "nuevos" segmentos las partes nuevas o modificadas de cada archivo, y esos nuevos segmentos se convierten en las únicas partes que necesita descargar el cliente para actualizar el juego.

Muchos motores de juegos usan archivos de "paquete" para acumular recursos del juego y mejorar los tiempos de carga, lo cual permite un acceso más eficiente al disco. En general, esto funciona bien con SteamPipe. Sin embargo, algunos sistemas de archivos de paquete usan o permiten usar comportamientos que pueden causar problemas. El efecto de estos problemas es que casi siempre las actualizaciones son mucho más grandes de lo necesario. También pueden hacer que la descarga sea rápida, pero el proceso de actualización sea lento, pues se requieren grandes cantidades de E/S en el disco local.

Si tu juego usa archivos de paquete, aquí tienes unas directrices generales al respecto.

  • Asegúrate de que los cambios en recursos estén lo más localizados posible dentro del archivo de paquete.
  • Evita cambiar el orden de los recursos dentro de un archivo de paquete.
  • Limita el tamaño del archivo de paquete.
  • Agrupa recursos por nivel, dominio y característica al incluirlos en los respectivos archivos de paquete, y considera la adición de nuevos archivos paquete para las actualizaciones, en lugar de modificar los ya existentes.
  • No incluyas ninguno de los nombres de archivo o las marcas de tiempo y fecha de las compilaciones y archivos de los distintos recursos.

La primera directriz de arriba se refiere al alcance del número de bytes que se cambian dentro de un archivo cuando se modifica uno de los recursos. Lo ideal es que se modifiquen los datos de ese recurso, y que aumenten o disminuyan en la misma ubicación que el archivo de paquete. SteamPipe solo creará nuevos segmentos para las porciones del archivo que contengan los datos del recurso. Sin embargo, todos los archivos de paquete necesitan también una especie de índice para que el motor encuentre los datos del recurso. La estructura de este índice puede tener un impacto significativo en la eficiencia de los parches de SteamPipe. Lo ideal es que haya un índice o una tabla de contenido en forma de árbol cerca del principio o fin del archivo. Dado que otros recursos pueden cambiar su posición en bytes dentro del archivo, sus entradas en el índice también cambiarán. En esa situación, SteamPipe creará nuevos segmentos para los datos de recursos modificados y para las porciones modificadas del índice.

Sin embargo, hemos visto en algunos motores de juego que la información del índice se reparte por todo el archivo. O lo que es peor, usa valores absolutos para la dirección relativa (byte-offset, en inglés). Así que si un recurso en el byte 3450 aumenta de tamaño 8 bytes, entonces los valores de la dirección relativa para todos los recursos que siguen en ese archivo serán distintos. A pesar de que cada valor de dirección relativa tiene un tamaño de solo 4 u 8 bytes, el cambio a un número de 8 bytes hará que el nuevo segmento creado por SteamPipe tenga un tamaño de 1 MB. Esto puede tener resultados negativos si se cambian incluso unos pocos recursos menores en un archivo de paquete, pues eso hace que los clientes tengan que descargar más de la mitad del archivo completo para realizar la actualización. Si sabes o sospechas que la estructura de tu archivo de paquete causa este problema, ponte en contacto con tu representante de Valve lo más pronto posible. Tenemos un algoritmo de compilación alternativo que puede ayudarte a mitigar el problema, aunque tiene sus desventajas.

Además, SteamPipe no tiene información sobre los límites entre recursos dentro de un archivo de paquete. Si se cambia el orden de los recursos inferiores a un megabyte, lo más probable es que no detecte el cambio, ya que los segmentos de 1 MB establecidos anteriormente ya no estarán presentes en el archivo. Así que, si en el proceso de crear una actualización para tu juego, quieres optimizar los tiempos de carga ajustando el orden de los recursos dentro del archivo de paquete, ten en cuenta el hecho de que eso puede hacer que la descarga de esa actualización sea muy grande. Recomendamos que se haga esto únicamente si las mejoras de rendimiento son significativas.

A continuación, para actualizar el archivo de paquete en el dispositivo cliente, SteamPipe crea una nueva versión junto a la versión anterior. Cuando se generan todos los archivos, se "aplica" la actualización borrando los archivos viejos e introduciendo en su lugar los nuevos. Esto implica que para hacer una actualización de un archivo de paquete de 25 GB, SteamPipe siempre creará un archivo nuevo también de 25 GB. Aunque la actualización solo requiera 10 bytes de cambios para ese archivo, SteamPipe tendrá que copiar casi el total de los 25 GB del archivo antiguo al nuevo. Dependiendo del hardware de almacenamiento del cliente, esto puede convertirse en un proceso muy lento. Por esa razón recomendamos hacer estas dos cosas:

Primero, limitar el tamaño de los archivos de paquete. Tal vez uno o dos GB es ya suficientemente grande; más que suficiente para permitir una lectura de disco eficiente al cargar el juego.

Segundo, limitar lo suficiente el volumen de recursos dentro de un archivo de paquete individual. Por ejemplo, restringirlo a un único nivel del juego o a una característica desbloqueable. De este modo, las actualizaciones que se enfocan en partes específicas de tu juego no hacen que se copien datos de otras partes del juego en el equipo del cliente. Además, al agregar nuevas funcionalidades, niveles, etc., se pueden y deberían ser colocados en sus propios archivos de paquete nuevos. Los clientes que descarguen esta actualización conseguirán una descarga más simple de los archivos nuevos y evitarán los problemas mencionados previamente con las modificaciones del archivo de paquete.

En caso de duda, puedes usar una herramienta para encontrar diferencias en binarios locales como Beyond Compare para comparar versiones de tus archivos de paquete. Verifica que las diferencias que se muestran son del tamaño que esperabas para los recursos cambiados, y que no haya quizás docenas o cientos de cambios menores esparcidos por todo el archivo. Si lo que ves no es lo que esperabas, comprueba la configuración de tu herramienta de archivos de paquete.

Compresión: ya que Steam comprime todos los datos para cargarlos, almacenarlos y descargarlos, generalmente no recomendamos comprimir los archivos de paquete. Sin embargo, si te preocupa el tamaño en disco de tu juego, tal vez quieras comprimir el archivo de paquete. Funcionará bien con SteamPipe siempre que cumplas los criterios mencionados anteriormente. Específicamente, deberás asegurarte de que, en la medida de lo posible, la compresión se haga por recurso. Si la compresión cruza los límites de los recursos, los cambios se esparcirán y los clientes tendrán que descargar más datos de los necesarios.

Cifrado: al igual que la compresión, suele ser innecesario y conlleva riesgos similares a los mencionados anteriormente.

Al seguir estas reglas, se reduce el tamaño de los parches y solo es necesario descargar el contenido nuevo. Los clientes te lo agradecerán y podrás aumentar la calidad de tus productos publicando más actualizaciones.

Si sospechas que los paquetes de tu juego no interactúan bien con el proceso de actualización de SteamPipe, ponte en contacto con tu agente de Valve y estudiaremos la posibilidad de activar funciones avanzadas para ayudarte.

Unreal Engine - Notas especiales

Algunas versiones de Unreal Engine utilizan alineación de los bytes de relleno de los recursos en los archivos de paquete, lo cual puede afectar mucho al tamaño de las actualizaciones de SteamPipe. La alineación puede provocar un desplazamiento en cascada de los recursos al crear versiones nuevas, sobre todo cuando la compresión de los archivos de paquete está activada. Para que las realineaciones desplacen los recursos un múltiplo del tamaño de bloque que SteamPipe utiliza para los cálculos diferenciales, se recomienda utilizar una alineación de los bytes de relleno de 1 MB (1048576).

Por ejemplo, para cambiar o especificar la alineación de los bytes de relleno mientras preparas los archivos de paquete de tu juego, tendrás que cambiar una línea en el archivo UnrealEngine/Engine/Source/Programs/AutomationTool/Win/WinPlatform.Automation.cs. En la función GetPlatformPakCommandLine incluida en ese archivo, cambia esta línea:

string PakParams = " -patchpaddingalign=2048";

por esta:

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

Con este cambio, deberías conseguir un comportamiento optimizado de las actualizaciones de SteamPipe incluso con la compresión de archivos de paquete activada.

Unreal Engine es una marca comercial o registrada de Epic en EE. UU. y otros países.

Tutorial en video de Steamworks: Cómo desarrollar tu juego en SteamPipe

Este tutorial presenta SteamPipe y los pasos para crear una aplicación de ejemplo para Steam a través de las herramientas de Steamworks.
https://www.youtube.com/watch?v=SoNH-v6aU9Q

Videotutorial de Steamworks: Cómo agregar nuevas plataformas e idiomas

Este tutorial te indica paso a paso cómo agregar nuevas plataformas e idiomas a tu juego agregando repositorios a tu aplicación.
https://www.youtube.com/watch?v=PShS32hcing

Información técnica de SteamPipe

SteamPipe usa el protocolo HTTP para la entrega de contenido. Debido a que las descargas son tráfico de red ordinario, cualquier caché HTTP de terceros entre el cliente y los servidores de Steam aumentará la velocidad de descarga. El contenido puede estar alojado por proveedores externos de CDN, que pueden agregarse fácilmente a nuestra red de contenidos. La mayoría de los firewalls para consumidores permiten el tráfico HTTP y no bloquean las descargas.

SteamPipe cuenta con un algoritmo de revisión eficiente que se basa en deltas binarios, cambiando solo las partes modificadas de los archivos de contenido existentes. Cuando se actualiza este contenido, solo es necesario enviar esas diferencias o deltas. Esto hace que las transferencias tanto de los desarrolladores como de los usuarios sean más pequeñas y rápidas. La mayoría de los asociados encontrarán que no es necesario usar Servidor de contenido local SteamPipe ya que pueden actualizar eficientemente las compilaciones en ramas privadas.

Cuenta de compilación de Steam

Antes de que puedas crear cualquier compilación en Steam, debes tener una cuenta de Steam en tu cuenta de Steamworks con los permisos "Editar metadatos de la aplicación" y "Publicar cambios en la aplicación en Steam" activados. Por razones de seguridad, se recomienda que tengas una cuenta de compilación dedicada con solo esos permisos; puedes crear una nueva cuenta de Steam para tal propósito en https://store.steampowered.com/join.

Cualquier administrador de tu cuenta de Steamworks puede agregar una cuenta de Steam y otorgar los permisos necesarios. Puedes encontrar más información sobre este proceso en la sección Administrar tu cuenta de Steamworks de la documentación. Un ejemplo sobre cómo se podría ver esta cuenta es:

create_build_account.png
Aviso: si tu cuenta de Steam necesita publicar una versión de una aplicación lanzada, deberá asociar un número de teléfono móvil o la aplicación móvil de Steam con la cuenta. Estos métodos se usarán para confirmar la configuración de una versión de una aplicación lanzada. Además, si la cuenta de Steam tiene algún cambio de seguridad (correo electrónico, número de teléfono, etc.), entonces deberás esperar 3 días antes de que puedas configurar la versión de la aplicación lanzada. Esto es para evitar que las cuentas comprometidas puedan administrar las versiones ya lanzadas de tu aplicación.

Configuración inicial de nuevas aplicaciones de SteamPipe

Sigue estos pasos para configurar nuevas aplicaciones de SteamPipe:
  1. Encuentra el id. de tu aplicación (puedes verlo seleccionando la aplicación en tu página principal en Steamworks).
  2. Ve a la página de ajustes generales de instalación de tu aplicación.
  3. Define al menos una opción de inicio (la ruta y, opcionalmente, los argumentos necesarios para iniciar el juego). Pon el cursor sobre los (?) para obtener más información acerca de cada campo.

    El ejemplo de abajo muestra 5 opciones de inicio: 2 para Windows, 2 para macOS y 1 para Linux.
    La opción de inicio 3 solo se mostrará en Windows si el usuario también posee el DLC especificado.

    updatedlaunchoptions_3.png
  4. Ve a la página Repositorios y agrega repositorios según sea necesario para esta aplicación. De forma predeterminada, es posible que un repositorio ya esté configurado para tu aplicación.
    1. Haz clic en el repositorio predeterminado y cámbiale el nombre a una denominación adecuada y reconocible (como "Contenido básico" o "Contenido de Windows").
    2. Deja el idioma en "Todos los idiomas" a menos que se trate de un repositorio específico de idioma.
    3. Deja el sistema operativo en "Todos los sistemas operativos" a menos que se trate de un repositorio específico de sistema operativo (si la aplicación es un todo en uno o es solo para PC o solo para Mac, debe dejarse como "Todos los sistemas operativos"). Especifícalo solo para repositorios de juegos específicos de sistema operativo.
    4. Haz clic en agregar nuevo repositorio para crear repositorios adicionales.
    5. Haz clic en Guardar para guardar los cambios realizados.
  5. Una vez que hayas terminado de definir tus repositorios, publica los cambios que hayas realizado en la página de Publicar.
  6. Los repositorios que acabas de definir deberán incluirse en un paquete para que adquieras su propiedad. Cada juego en Steam debe tener un paquete "Developer Comp" que se concede automáticamente a las cuentas que figuran en tu grupo de editor.
    Puedes agregar los nuevos repositorios a ese paquete (o a otros paquetes que deban tenerlos) en la página de Paquetes y DLC asociados.
Nota: Si el ejecutable está en una subcarpeta de la carpeta de instalación principal, agrega el nombre de la subcarpeta en el campo Ejecutable. No utilices barras o puntos iniciales.
Nota de plataforma: Como se muestra más arriba, las aplicaciones de macOS pueden iniciarse especificando un paquete de aplicación (Game.app) o un script/binario (Game.app/Contents/MacOS/Game). En general se prefiere el formato del lote de aplicaciones si es posible, dado que permite que macOS determine de forma más precisa las configuraciones de lanzamiento en la forma en la que lo haría si se lanzase manualmente fuera de Steam.

Un caso de esta situación a tener en cuenta es que las aplicaciones que actualmente se lanzan mediante un lote de aplicaciones en dispositivos Apple Silicon lanzarán la mejor arquitectura disponible en la aplicación, mientras que los lanzamientos directos de binarios usarán la misma arquitectura que el proceso de Steam (actualmente x86_64).

Configuración del SDK para subir archivos a SteamPipe

Descarga y descomprime la versión más reciente del SDK de Steamworks en el equipo en el que vayas a cargar las compilaciones.

Puedes encontrar las herramientas de SteamPipe dentro del SDK en la carpeta tools, que contiene dos subdirectorios relevantes.

El directorio ContentBuilder es donde se alojarán el contenido de tu juego y las herramientas de compilación de SteamPipe. Este directorio contiene los siguientes subdirectorios:
  • builder: inicialmente este directorio solo contiene steamcmd.exe, que es la versión de línea de comandos de Steam.
  • builder_linux: la versión de Linux de steamcmd.
  • builder_osx: la versión de macOS de SteamCMD.
  • content: este directorio contiene todos los archivos del juego que se integrarán en los repositorios.
  • output: este directorio será la ubicación de los registros de compilación, el caché de fragmentos y la salida intermedia. NOTA: Esta carpeta puede borrarse o vaciarse en cualquier momento, pero una vez que se borre, la siguiente carga de datos llevará más tiempo.
  • scripts: este directorio es donde colocarás todos tus scripts de compilación para desarrollar tus repositorios para el juego.
steampipebuilddir.png

Se recomienda ejecutar steamcmd.exe directamente desde la carpeta "builder" de tu plataforma una vez para arrancar tu sistema de compilación. Esto deberá llenar tu directorio de compilación con todos los archivos que necesita para construir repositorios.

El directorio ContentServer contiene las herramientas para ejecutar tu propio Servidor de contenido local SteamPipe si decides hacerlo.

SteamCMD en macOS

Para activar SteamCMD en macOS, debes completar los siguientes pasos:
  1. En Terminal, ve a la carpeta tools/ContentBuilder/builder_osx.
  2. Ejecuta chmod +x steamcmd
  3. Introduce bash ./steamcmd.sh
  4. SteamCMD se ejecutará, se actualizará a la compilación más reciente y te dejará en el prompt de SteamCMD.
  5. Escribe "exit" y presiona la tecla Return para salir del prompt.
Después podrás seguir el resto de esta documentación (reemplazando las rutas según corresponda) para crear archivos de configuración de repositorios y aplicaciones para subir tu contenido a Steam.

Creación de archivos de configuración para la compilación en SteamPipe

Para subir archivos de tu aplicación con SteamPipe, debes crear scripts que describan tu compilación y cada repositorio incluido en ella. Los scripts de ejemplo que aquí se muestran los puedes encontrar en la carpeta Tools\ContentBuilder\scripts del SDK de Steamworks.

Herramienta de interfaz gráfica de usuario de SteamPipe

Si estás usando Windows y prefieres una herramienta gráfica que te ayude a crear estos archivos de configuración y a cargar tus compilaciones, puedes usar SteamPipe GUI, que se encuentra en la carpeta de herramientas del SDK de Steamworks. En el archivo zip hay instrucciones adicionales para ayudarte a comenzar.

Si decides utilizar la herramienta de la interfaz gráfica de usuario, se recomienda leer las siguientes secciones para familiarizarte mejor con el funcionamiento del sistema SteamPipe.

Script de compilación simple


Empecemos con el script de compilación más básico posible. En nuestro ejemplo, tenemos un juego (id. de aplicación 1000) que tiene un repositorio (id. de repositorio 1001) y queremos cargar todos los archivos de una carpeta de contenido y sus subcarpetas. Para ello solo necesitamos un único script de compilación. Consulta el archivo "simple_app_build.vdf" incluido en el SDK:

"AppBuild" { "AppID" "1000" // tu id. de aplicación "Desc" "Esto es un script de compilación simple" // Descripción interna de esta compilación "ContentRoot" "..\content\" // carpeta raíz del contenido, relativa a la ubicación de este archivo "BuildOutput" "..\output\" // carpeta de salida de compilación para registros de compilación y archivos de caché "Depots" { "1001" // tu id. de repositorio { "FileMapping" { "LocalPath" "*" // todos los archivos de la carpeta contentroot "DepotPath" "." // asignados en la raíz del repositorio "recursive" "1" // incluidas todas las subcarpetas } } } }

Ajusta los ids. de aplicación y de repositorio de tu juego según sea necesario. Para iniciar una compilación, deberás ejecutar "steamcmd" y pasar un par de parámetros:
tools\ContentBuilder\builder\steamcmd.exe +login <account_name> <password> +run_app_build ..\scripts\simple_app_build.vdf +quit

Los siguientes pasos se producen durante una compilación de SteamPipe:
  1. steamcmd.exe se actualizará a sí mismo a la última versión.
  2. steamcmd.exe inicia sesión en el backend de Steam empleando la cuenta del compilador de Steam dada.
  3. El comienzo de la compilación de la aplicación se registra en el MDS (Servidor repositorio maestro), que se asegurará de que el usuario tenga los privilegios adecuados para modificar esta aplicación.
  4. Por cada repositorio incluido en la compilación de la aplicación, se genera un archivo basado en los archivos de la carpeta de contenido y las reglas de filtrado definidas en el archivo de configuración de compilación de repositorio.
  5. Cada archivo se escanea y se divide en pequeños segmentos de 1 MB, aproximadamente. Si el repositorio se ha construido antes, esta partición preserva tantos segmentos no cambiados como sea posible.
  6. Los nuevos segmentos de archivo se comprimen, se cifran y se cargan al MDS.
  7. Se genera un manifiesto final para esta versión del repositorio; cada manifiesto se identifica mediante un id. exclusivo de 64 bits.
  8. Una vez que todos los repositorios se han procesado, el MDS termina esta compilación de la aplicación y la asigna a un id. de compilación global.
  9. Una vez concluida la compilación, en la carpeta de salida de esta compilación pueden aparecer archivos *.csm y *.csd. Son temporales y pueden eliminarse, aunque sirven para acelerar posteriores compilaciones.


Una vez que la compilación esté completa, puedes verla en la página de compilaciones de tu aplicación que, en este caso, sería https://partner.steamgames.com/apps/builds/1000. Desde allí, puedes publicar la compilación en la rama predeterminada o en cualquier rama beta, y los usuarios podrán descargar esta actualización al cabo de un par de minutos.

Scripts de compilación avanzada


Si tu aplicación tiene muchos repositorios con reglas de asignación de archivos complejas, puedes crear un script de compilación para cada repositorio, al cual se remitirá el script de compilación de la aplicación. Empecemos echando un vistazo a los parámetros disponibles en el script de compilación de la aplicación:

  • AppID: el id. de aplicación de tu juego. La cuenta de asociado de Steam utilizada para realizar la carga necesita el permiso "Editar metadatos de la aplicación".
  • Desc: la descripción solo se puede ver en la sección "Tus compilaciones" del panel de administración de la aplicación. Esto se puede cambiar en cualquier momento después de haber cargado la compilación en la página de "Tus compilaciones".
  • ContentRoot: la carpeta raíz de los archivos de tu juego. Puede ser una ruta absoluta o una relativa al archivo de script de compilación.
  • BuildOutput: este directorio es la ubicación de los registros de compilación, manifiestos de repositorio, fragmentos de caché y la salida intermedia. Para obtener el mejor rendimiento, utiliza un disco diferente para la salida de tu compilación. Esto reparte la carga de trabajo de entrada/salida de disco, permitiendo que el disco raíz de contenido maneje las solicitudes de lectura y el disco de salida, las de escritura.
  • Vista previa: este tipo de compilación solo genera registros y un archivo de manifiesto en la carpeta de salida de la compilación. Crear compilaciones de vista previa es una buena forma de iterar en tus scripts de carga y asegurarte de que las asignaciones de archivos, los filtros y las propiedades funcionen según lo previsto.
  • Local: establece esto a la ruta htdocs de tu Servidor de contenido local SteamPipe (SCL). Las compilaciones de SCL solo colocan contenido en tu propio servidor HTTP y te permiten probar la instalación de tu juego usando el cliente de Steam.
  • SetLive: nombre de la rama beta que se publicará automáticamente después una compilación exitosa, ninguno si está vacío. Ten en cuenta que la rama "predeterminada" no se puede publicar automáticamente. Eso debe hacerse a través del panel de administración de la aplicación.
  • Depots: esta sección contiene todas las asignaciones de archivos, filtros y propiedades de archivo para cada repositorio o hace referencia a un archivo de script independiente para cada repositorio.

Ejemplo de script de compilación de aplicación app_build_1000.vdf que usa todas las opciones:
"AppBuild" { "AppID" "1000" // id. de aplicación de tu juego "Desc" "Aquí va la descripción de tu compilación" // descripción interna de esta compilación "Preview" "1" // hace una compilación de vista previa, pero nada se carga "Local" "..\..\ContentServer\htdocs" // coloca el contenido en el servidor de contenido local en lugar de cargarlo en Steam "SetLive" "AlphaTest" // publica esta compilación en una rama beta "ContentRoot" "..\content\" // carpeta raíz del contenido relativa a este archivo de script "BuildOutput" "D:\build_output\" // coloca los registros de archivo y caché de la compilación en diferentes unidades para un rendimiento mejor "Depots" { // las instrucciones de asignación de archivos para cada repositorio están en archivos de script separados "1001" "depot_build_1001.vdf" "1002" "depot_build_1002.vdf" } }

Este script de compilación de aplicación hace referencia a dos archivos de script de compilación de repositorio que especifican todas las asignaciones y propiedades de archivos. Las siguientes instrucciones están disponibles para los scripts de compilación de repositorio (y también si la sección se incluye directamente en el script de compilación de aplicación).

  • DepotID: Id. de repositorio de esta sección.
  • ContentRoot: te permite opcionalmente sobrescribir la carpeta "ContentRoot" desde el script de compilación según el repositorio.
  • FileMapping: asigna un solo archivo o un conjunto de ellos desde la carpeta raíz del contenido local a su repositorio. Puede haber múltiples asignaciones de archivo que agreguen archivos al repositorio. El parámetro LocalPath es una ruta relativa a la carpeta raíz del contenido y puede contener caracteres especiales como "?" o "*". También se aplicará a los archivos coincidentes en subcarpetas si Recursive está habilitado. El parámetro DepotPath especifica dónde deberían aparecer los archivos seleccionados en el repositorio (utiliza simplemente "." si no deseas una asignación en particular).
  • FileExclusion: excluirá los archivos ya asignados. Puede contener caracteres especiales como "?" o "*".
  • InstallScript: marca un archivo como un script de instalación y lo firma durante el proceso de compilación. El cliente de Steam sabe que hay que ejecutarlos al iniciar cualquier aplicación que contenga este repositorio.
  • FileProperties: pone marcas especiales en un archivo:
    • userconfig: este archivo ha sido modificado por el usuario o el juego. No lo puede anular una actualización y no activa un error de verificación si difiere de las versiones previas del archivo.
    • versionedconfig: es parecido a userconfig, sin embargo, si el archivo se actualiza en el repositorio, se sobrescribirá localmente cuando se actualice el juego del usuario. Actualiza solo el archivo en el repositorio cuando haya un cambio de formato necesario o corrección de errores.

Ejemplo de script de compilación de repositorio depot_build_1002.vdf que muestra el uso de todas las opciones:
"DepotBuild" { "DepotID" "1002" "ContentRoot" "C:\content\depot1002" // sobrescribe el valor de ContentRoot del script de compilación de la aplicación "FileMapping" { // todos los archivos y carpetas de origen en la carpeta ".\bin" se asignarán a la carpeta ".\executables" en el repositorio "LocalPath" "bin\*" "DepotPath" "executables\" "Recursive" "1" // incluye todas las subcarpetas } "FileMapping" { // sobrescribe todos los archivos de audio en \\audio con versiones en alemán "LocalPath" "localization\german\audio\*" "DepotPath" "audio\" } "FileMapping" { // copia el script de instalación para la versión de alemán a la carpeta raíz del repositorio "LocalPath" "localization\german\german_installscript.vdf" "DepotPath" "." } "FileExclusion" "bin\server.exe" // excluye este archivo "FileExclusion" "*.pdb" //excluye todos los archivos .PDB de cualquier carpeta "FileExclusion" "bin\tools*" // excluye todos los archivos de la carpeta bin\tools\ "InstallScript" "localization\german\german_installscript.vdf" "FileProperties" { "LocalPath" "bin\setup.cfg" "Attributes" "userconfig" // este archivo se modifica en tiempo de ejecución } }

NOTA: Puedes llamar a estos scripts como quieras, pero nosotros usamos los nombres app_build_<appid> y depot_build_<id. de repositorio> por razones de uniformidad. Si sabes que vas a crear aplicaciones en este equipo, tal vez sea buena idea crear subdirectorios en el directorio de scripts de cada aplicación para ayudar a organizar los scripts de compilación de cada una de ellas.

Uso de SteamPipe en un entorno CI/CD


Para configurar steamcmd para integración continua, o simplemente en un equipo o máquina virtual que recibirá nuevas imágenes con frecuencia, tendrás que incluir el archivo de configuración que contiene tu token de inicio de sesión. Sigue estos pasos para que tu token de inicio de sesión original se guarde correctamente:

  1. Ejecuta steamcmd.exe +login <nombre de usuario> en el equipo que vaya a realizar la compilación.
  2. Ingresa tu contraseña y el token de Steam Guard.
  3. Escribe "info". Deberías ver que tu cuenta aparece como conectada.
  4. Escribe "quit".
  5. No ingreses la contraseña en sucesivas ejecuciones; simplemente escribe "steamcmd.exe +login <nombre de usuario>".
  6. Asegúrate de que el archivo de configuración almacenado en <Steam>\config\config.vdf se guarda y se conserva entre ejecuciones, ya que este archivo puede actualizarse tras un inicio de sesión exitoso.

NOTA: Si vuelves a iniciar sesión y proporcionas tu contraseña, se emitirá un nuevo token de Steam Guard que será necesario para iniciar sesión.

Gestión de las actualizaciones

Una vez que tu aplicación se lanza al público, los clientes reciben la compilación marcada como predeterminada. Al cargar una nueva compilación, siempre es buena idea probarla antes de enviársela a los clientes. Para obtener más información sobre cómo hacerlo correctamente, consulta el artículo Pruebas en Steam.

Depuración de problemas de compilación

Si la compilación no se completó correctamente, busca información sobre errores en el directorio de salida, no en la consola donde se ejecutó el script de compilación. La mayor parte de la información sobre errores puede encontrarse en los archivos *.log.
Puedes utilizar estos comandos y archivos del cliente de Steam para depurar problemas:
  • "app_status [appid]": muestra el estado actual de la aplicación en este cliente.
  • "app_info_print [appid]": muestra la configuración actual de Steamworks para este juego (repositorios, opciones de lanzamiento, etc.).
  • "app_config_print [appid]": muestra la configuración de usuario actual para este juego (idioma actual, directorio de instalación, etc.).
  • file "logs\content_log.txt": enumera todas las operaciones y errores registrados de SteamPipe.
  • file "steamapps\appmanifest_[appid].acf": muestra el estado de instalación actual de esta aplicación (KeyValues).

Compilación de discos de instalación comerciales

Para crear un disco de instalación para venta minorista para un juego de SteamPipe, primero debes configurar un archivo de proyecto de compilación.
En este ejemplo, el archivo SKU se llama "sku_goldmaster.txt":
"sku" { "name" "Instalador de la prueba de juego" "appid" "202930" "disk_size_mb" "640" "included_depots" { "1" "202931" "2" "202932" } }
Algunos consejos para tener en cuenta:
  • Crea una nueva carpeta en la que se escribirán las imágenes del disco comercial, p. ej., "D:\retail_disks". Solo se agregan repositorios en las secciones included_depots; ya no existe una sección de exclusión.
  • Puedes utilizar Steam.exe (con los parámetros de línea de comandos -dev y -console) o steamcmd.exe para compilar imágenes de instalación. En ambos casos, usa el comando "build_installer".
  • Inicia sesión con la cuenta de Steam que tenga el juego y todos los repositorios que quieras poner en el disco comercial. Por lo demás, la cuenta no precisa de derechos especiales, por lo que cualquiera puede compilar discos de instalación.
  • Si utilizas Steam.exe, detén el resto de las descargas.
  • Ve a la página de la consola y ejecuta el comando "build_installer":
    build_installer sku_goldmaster.txt "D:\retail_disks"
    La compilación puede llevar cierto tiempo porque todos los repositorios vuelven a descargarse la primera vez.
  • Si estás creando un GM utilizando un servidor de contenido local, ejecuta:
    @localcontentserver "webserver"
    build_installer sku_goldmaster.txt "D:\retail_disks" local
    El spew se refiere a "Copia de seguridad", ya que "Copia de instalación minorista" y las copias de seguridad del juego local son básicamente las mismas.
  • Cuando veas "Copia de seguridad terminada para AppId...", las imágenes de disco de instalación están listas. Puedes encontrar más detalles sobre la creación de la copia de seguridad en logs\backup_log.txt.
  • Hay nuevas carpetas (Disk_1, Disk_2, etc.) en "D:\retail_disks", cada una no es mayor que 640 MB, como se especifica con "disk_size_mb". Cada carpeta de disco contiene un archivo "sku.sis" y un archivo .csd y .csm por cada repositorio. Los repositorios más grandes se reparten por varios discos. Todo el contenido de los discos de instalación comerciales se cifra siempre (al contrario que los archivos de copia de seguridad locales del juego). Copia los archivos de configuración SDK GM (setup.exe, setup.ini, etc.) en la carpeta de tu primer disco y el instalador de disco comercial queda completado.
  • Al crear un GM para macOS, asegúrate de abrir la imagen goldmaster/disk_assets/SteamRetailInstaller.dmg en un Mac. A continuación, toma la aplicación que contiene y cópiala en la raíz de tu soporte. Probablemente, quieras cambiar el nombre de la aplicación de instalación, marcar el ícono y decorar la ventana para que solo muestre el instalador.
  • Al crear GM multidisco para macOS, asegúrate de que el nombre del volumen de cada disco coincida. El nombre del volumen se convierte en parte de la ruta de montaje y, si los nombres no coinciden, el instalador no podrá encontrar el disco siguiente.

Creación opcional de un instalador comercial a partir de una rama beta

El proceso anterior crea un instalador comercial basado en la rama predeterminada. Si necesitas crear un instalador basado en una rama beta, primero debes crear una rama beta llamada "baseline". A continuación, utiliza el siguiente comando para compilar desde la rama "baseline":
build_installer <project file> <target folder> <beta key> <beta pwd> steamcmd ex: build_installer sku_goldmaster.txt "D:\retail_disks" baseline superSecret script ex: steamcmd.exe +login user_name password +build_installer "..\Build\GameDataSku.txt" c:\destination beta_key beta_password +exit

Instalación de DLC desde un instalador comercial

En algunas circunstancias, puede ser útil crear un instalador comercial que incluya tus paquetes de DLC. En tales casos, el proceso para crear el instalador solo requiere algunos cambios.
Incluye en "sku_goldmaster.txt" los ids. de aplicación de los DLC en la sección "included_depots". Una vez que hayas ejecutado el proceso "build_installer", busca el archivo sku.sis generado para el instalador y ábrelo con un editor de texto.
Agrega el id. de aplicación del DLC en la sección "apps". Por ejemplo, si tengo un juego con id. de aplicación 1000 e id. de aplicación del DLC 1010, ajustaría la sección "apps" de la siguiente manera:
"apps" { "0" "1000" "1" "1010" }
De esta forma, Steam comprobará la propiedad del DLC y le solicitará al usuario una clave si el DLC no es propiedad de la cuenta con la que inicia sesión en Steam.

Compilación de un instalador comercial para varios ids. de aplicación en un solo disco o paquete de instalación

Para compilar una versión GM que contenga varias aplicaciones de SteamPipe, compila, uno por uno, cada instalador de aplicación, pero dirígelos todos a la misma carpeta de salida. Cada compilación se combinará con la imagen de instalación ya existente.

Personalización de un disco de instalación comercial

Consulta Creación de un disco comercial y "Gold Master" para obtener más información sobre cómo personalizar tu disco de instalación comercial.

Precarga de juegos antes del lanzamiento

De forma predeterminada, todo el contenido se cifra siempre, tanto en los discos comerciales como en los servidores de contenido. Al cambiar un juego al modo de precarga, los propietarios pueden descargar el contenido, pero permanece cifrado en el disco del usuario y el juego no se puede iniciar para jugar. Una vez que el juego se lanza oficialmente, Steam descifra el contenido precargado y el usuario puede jugarlo.

Se recomienda pasar un juego al modo de precarga en estos casos:
  • Cuando se envían discos comerciales con claves de producto antes de que el juego esté disponible (piratería del día cero).
  • Si se trata de juegos que ofrecen una precompra y superan los 20 GB de tamaño.

Envía un ticket a Steam Publishing si crees que tu juego requiere una precarga.

Creación de DLC

Los DLC se crean como repositorios del juego base. Consulta la documentación de Contenido descargable (DLC) para obtener más información.

Solución de problemas de SteamPipe

"Error de inicio de sesión: el inicio de sesión de cuenta ha sido denegado" al iniciar sesión a través de steamcmd.

Causa: Es probable que SteamGuard esté impidiendo el inicio de sesión. Solución:
  • Revisa el correo electrónico asociado a la cuenta con la que intentas iniciar sesión y busca un mensaje del Soporte de Steam. Copia el código que aparece en el correo electrónico.
  • Ejecuta el siguiente comando en SteamCMD: set_steam_guard_code <code>
  • Vuelve a intentar iniciar sesión de nuevo desde SteamCMD: Steam>login <buildaccount> <password>

Resolución de problemas generales de descarga

  • Reinicia el equipo, módem, enrutador, etc.
  • Verifica la configuración del firewall. El nuevo sistema requiere usar el puerto 80 (HTTP) y los demás puertos de Steam que aparecen listados aquí.
  • Deshabilita temporalmente los programas antivirus o contra correo no deseado instalados en tu equipo.
  • Verifica la región de descarga de Steam en Configuraciones->Descargas. Tiene que coincidir con tu ubicación.
  • Detén la descarga, desinstala el juego y vuelve a instalarlo (después de limpiar las cachés de manifiesto).
  • Sal de Steam y borra las carpetas "appcache" y "depotcache" en la carpeta de instalación de Steam.
  • Intenta seleccionar una región distinta y lejana como región de descarga de Steam. Puede que esto funcione si un servidor de contenidos próximo a ti está transmitiendo datos erróneos.

Mis compilaciones de Mac o Linux no instalan archivos. ¿Por qué?

Si pruebas la instalación de tu juego o aplicación a través de Steam en distintas plataformas, es posible que te encuentres con que la compilación se implementa en Windows, pero no instala ningún archivo en Mac o Linux, a pesar de que el proceso de SteamPipe esté configurado para cargar los repositorios de Mac o Linux. Un paso que a menudo se olvida es el de agregar los repositorios alternativos al paquete que se está implementando. Sigue estos pasos para comprobar qué repositorios están incluidos en un paquete:
  1. Ve a tu página de administrador de la aplicación.
  2. En la sección "Ver artículos asociados", haz clic en "Todos los paquetes, contenido descargable, demos y herramientas asociados".
  3. Haz clic en el título del paquete que quieres descargar.
  4. Revisa la sección "Repositorios incluidos".
  5. Usa "agregar o quitar repositorios" para asegurarte de que están asignados al paquete los repositorios correctos.
Hay una serie de hilos de discusión sobre esto que pueden serte de ayuda:

La ejecución de steamcmd.exe produce el siguiente error: "SteamUpdater: Error: Steam necesita estar en línea para actualizar. Confirma tu conexión de red e inténtalo de nuevo".

Solución: Ve a Opciones de Internet->Conexiones->Configuración Lan y marca Detectar configuraciones automáticamente.

Al ejecutar la compilación de la aplicación, se produce el siguiente error: "¡ERROR! Ha fallado "DepotBuild for scriptname.vdf". Estado = 6."

Posibles causas:
  • La cuenta no tiene los permisos requeridos por la aplicación.
    • Asegúrate de que el id. de aplicación es correcto en "app_build.vdf".
    • Verifica que la cuenta de compilación tenga permisos adecuados para el id. de la aplicación.
  • SteamCMD no encuentra los contenidos del repositorio.
    • Asegúrate de que el valor de "contentroot" en el script "app_build" es una ruta de acceso válida a la ubicación del archivo del script.
    • Asegúrate de que el valor de "LocalPath" en el script "depot_build" es una ruta válida en relación con la ruta en el script "app_build". Asegúrate de que la ruta incluye contenido.

Al ejecutar la aplicación, se produce el siguiente error: "¡ERROR! No se ha obtenido la información de la aplicación NNNNN (comprobar inicio de sesión y suscripción)".

Esto quiere decir que Steam no puede recuperar la información sobre la aplicación, bien porque no existe o bien porque el usuario no tiene acceso a la aplicación.
  • Asegúrate de que NNNNN es el id. de aplicación que se te asignó para la aplicación.
  • Asegúrate de que el id. de aplicación es correcto en app_build.vdf.
  • Si se trata de un nuevo id. de aplicación, asegúrate de que se ha publicado la configuración del administrador de aplicaciones de Steamworks. Las aplicaciones nuevas deben tener tanto un directorio de instalación de Steam Pipe como un repositorio (ambos disponibles en "Editar ajustes de Steamworks"). El directorio de instalación está en "Instalación general", en la pestaña "Instalación", y "Repositorios" en la pestaña SteamPipe. Todos los cambios se publican en la pestaña "Publicar".
  • Si todo esto parece estar bien, asegúrate de que tu cuenta tiene el id. de aplicación.

"Se ha producido un error al instalar [nombre de la aplicación] (configuración de contenido no válida)" en el momento del lanzamiento

Posibles causas:
  • No hay ninguna compilación definida como activa en la rama desde la que intentas instalar.
    Resolución: Define como activa una compilación en una rama yendo a https://partner.steamgames.com/apps/builds/<Id. de aplicación del juego> y selecciona esa rama en el cliente de Steam (como se describe aquí).
  • Configuraciones de lanzamiento de juego no válidos.
    Resolución: Verifica las configuraciones de lanzamiento en la pestaña Instalación en el administrador de aplicaciones de tu juego (https://partner.steamgames.com/apps/config/<Id. de aplicación del juego>).
  • No posees los ids. de repositorio que conforman el juego.
    Resolución: Asegúrate de que se agreguen los repositorios necesarios a la suscripción de desarrollo (consulta Edición de paquetes para más detalles).

No recuerdo qué comando de SteamCMD era o cómo funcionaba

Usa el comando "find" en SteamCMD para encontrar cualquiera de esos comandos. Buscará coincidencias parciales con el nombre del comando y mostrará la sintaxis.
Steam>find build_installer ConVars: Commands: build_installer : <project file> <target folder> <beta key> <beta pwd>