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 Actualizando 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, deberías estar familiarizado con todos los conceptos descritos en la sección Aplicaciones de la documentación. Tener siquiera una comprensión básica de cómo encajan estas piezas será de gran utilidad cuando subas 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, consulta las notas específicas sobre archivos de paquete al final de esta sección.

Inicialmente, SteamPipe divide cada archivo en segmentos de aproximadamente un megabyte (MB). A continuación, cada segmento se comprime y se cifra antes de cargarse en el sistema de distribución de contenido de Steam. Los segmentos siguen comprimidos y cifrados hasta que el cliente los descarga, los descifra, los descomprime y los coloca en las ubicaciones correspondientes.

Al procesar una actualización para un juego existente, SteamPipe busca los segmentos que coincidan con la compilación anterior del juego. De esa forma, solo se convierten en «nuevos» segmentos las partes nuevas o modificadas de cada archivo, y el cliente solo tiene que descargar esos nuevos segmentos 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 al disco más eficiente. En general, esto funciona bien con SteamPipe. Sin embargo, algunos sistemas de archivos de paquete usan o permiten usar comportamientos que pueden causar problemas. Casi siempre, estos problemas hacen que las actualizaciones sean más grandes de lo necesario. También pueden hacer que la descarga sea rápida, pero que el proceso de actualización sea lento, ya que se requieren grandes cantidades de E/S en el disco local.

Si tu juego usa archivos de paquete, aquí tienes algunas directrices generales sobre este tipo de archivos.

  • 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á segmentos nuevos para las partes del archivo que contengan los datos del recurso. No obstante, 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 afectar significativamente a la efectividad 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 ese caso, SteamPipe creará nuevos segmentos para los datos de los recursos modificados y para las secciones 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 el desplazamiento de bytes. Por lo tanto, si un recurso en el byte 3450 aumenta de tamaño 8 bytes, cambiarán los valores de desplazamiento de todos los recursos que lo siguen en este archivo. A pesar de que cada valor de desplazamiento tiene un tamaño de solo 4 u 8 bytes, un aumento a 8 bytes hará que SteamPipe cree un nuevo segmento de 1 MB. Esto puede causar estragos, ya que, con solo cambiar unos cuantos recursos pequeños en un archivo de paquete, los clientes tendrán que descargar más de la mitad del archivo completo para hacer 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 de forma inmediata. 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. Por lo tanto, al crear una actualización para tu juego, si quieres optimizar los tiempos de carga ajustando el orden de los recursos dentro del archivo de paquete, ten en cuenta que eso puede hacer que la descarga de esa actualización sea muy grande. Solo recomendamos hacerlo cuando se consigan mejoras significativas en el rendimiento.

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 acaban de generar todos los archivos, elimina los archivos antiguos e introduce los archivos nuevos para confirmar la actualización. Esto quiere decir que, para actualizar un archivo de paquete de 25 GB, SteamPipe siempre crea un archivo nuevo de 25 GB. Aunque la actualización solo requiera 10 bytes de cambios en ese archivo, SteamPipe tendrá que copiar los 25 GB del archivo viejo al nuevo casi en su totalidad. Dependiendo del hardware de almacenamiento del cliente, el proceso puede ser muy lento. Por eso, recomendamos dos cosas.

Primero, limitar el tamaño de los archivos de paquete. Un tamaño de 1 o 2 GB debería ser suficiente; más que suficiente para que el disco se pueda leer de forma eficiente al cargar el juego.

Segundo, limitar lo suficiente el volumen de los recursos dentro de cada archivo de paquete. Por ejemplo, restringirlo a un único nivel del juego o a una característica desbloqueable. De esta forma, las actualizaciones centradas en partes específicas del juego no hacen que se copien datos de otras partes del juego en el equipo cliente. Además, las funcionalidades, niveles, etc., que se añadan pueden y probablemente deberían colocarse en sus propios archivos de paquete nuevos. Los clientes que descarguen esta actualización descargarán simplemente los archivos nuevos y evitarán los problemas mencionados arriba con las modificaciones del archivo de paquete.

En caso de duda, puedes usar una herramienta para encontrar diferencias en binarios locales como Beyond Compare y comparar versiones de tus archivos de paquete. Comprueba que las diferencias que ves tienen el tamaño normal para los recursos modificados y que no haya docenas o cientos de cambios pequeños por todo el archivo. Si no ves lo que esperabas, comprueba la configuración de tu herramienta de archivos de paquete.

Compresión: puesto que Steam comprime todos los datos para cargarlos, almacenarlos y descargarlos, normalmente 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. Concretamente, deberías asegurarte de que, en la medida de lo posible, la compresión se hace 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 conllevar riesgos similares a los mencionados anteriormente.

Al seguir estas reglas, se reduce el tamaño de los parches y solo es necesario descargar el nuevo contenido. 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 vídeo 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

Tutorial en vídeo de Steamworks - Cómo añadir nuevas plataformas e idiomas

Este tutorial te indica paso a paso cómo añadir 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. Dado 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 añadirse 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 eficiente algoritmo de parcheado 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 más rápidas. La mayoría de los asociados descubrirán que no es necesario usar un Servidor de contenido local SteamPipe, ya que pueden parchear eficientemente las compilaciones en ramas privadas.

Cuenta de compilación de Steam

Para poder crear compilaciones 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 añadir 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 del aspecto que presentaría esta cuenta sería:

create_build_account.png
Note: If the Steam account will need to set a build live for a released app, it will need either a phone number attached to their account or have the Steam Mobile App attached to their account. Those methods will be used to confirm setting a build live for a released app. Additionally, if the Steam account has any security changes (email, phone number, etc), then you will need to wait 3 days before you can set a build live for a released app. This is to prevent compromised accounts from being able to manage your app's released builds.

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 Añadir 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 añadir 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, añade 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 los parámetros 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 cargas 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 se ubicarán 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 símbolo del sistema o prompt de SteamCMD.
  5. Teclea «exit» y pulsa Intro para salir del símbolo del sistema.
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 los 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 se muestran aquí 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.

Aunque decidas utilizar la herramienta de la interfaz gráfica de usuario, te recomendamos que leas 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

La compilación de SteamPipe sigue estos pasos:
  1. steamcmd.exe se actualiza a su versión más reciente.
  2. steamcmd.exe inicia sesión en el backend de Steam con la cuenta del compilador de Steam correspondiente.
  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 completada la compilación, 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 avanzados


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.
  • Preview: 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 del 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 de una compilación exitosa (ninguna 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 de la aplicación para cada repositorio.
  • FileMapping: asigna un solo archivo o un conjunto de ellos desde la carpeta raíz del contenido local a tu repositorio. Puede haber múltiples asignaciones de archivo que añadan 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 ha de 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_<id. de aplicación> 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 ordenador que vaya a realizar la compilación.
  2. Introduce 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 introduzcas 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).

Creación de discos de instalación para venta minorista

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 juego de prueba" "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 añaden 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 necesita tener derechos especiales, así 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 informe se refiere a la «Copia de seguridad», ya que la «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 el id. de aplicación...», las imágenes de disco de instalación estará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» y ninguna tiene un tamaño superior a 640 MB, como se especifica con «disk_size_mb». Cada carpeta de disco contiene un archivo sku.sis, y un archivo .csd y .csm para 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 icono y decorar la ventana para que solo muestre el instalador.
  • Al crear un 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 comando siguiente 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 unos pocos 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.
Añade 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 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 jugar al juego.

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 él.
  • Ejecuta el siguiente comando en SteamCMD: set_steam_guard_code <code>
  • Intenta iniciar sesión de nuevo desde SteamCMD: Steam>login <buildaccount> <password>

Resolución de problemas generales de descarga

  • Reinicia el ordenador, 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 Parámetros->Descargas. Tiene que coincidir con tu ubicación.
  • Detén la descarga, desinstala el juego y vuelve a instalarlo (tras 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 añadir los repositorios alternativos al paquete que se está implementando. Sigue estos pasos para comprobar qué repositorios incluye 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 «Añadir o quitar repositorios» para asegurarte de que están asignados al paquete los repositorios correctos.
Hay varios hilos de discusión sobre esto que también te pueden ayudar:

La ejecución de steamcmd.exe produce el siguiente error: «SteamUpdater: Error: Steam debe estar conectado para actualizarse. Confirma tu conexión de red e inténtalo de nuevo».

Solución: Ve a «Opciones de Internet»->«Conexiones»->«Configuración de LAN» y marca «Detectar la configuración 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 es la poseedora del 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í).
  • Parámetros de lanzamiento de juego no válidos.
    Resolución: Comprueba los parámetros 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 añadan 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>