Dokumentasi Steamworks
Mengunggah ke Steam
Di bawah ini adalah panduan untuk menggunakan SteamPipe, alat Valve untuk mengirimkan konten ke Steam. Untuk info lebih lanjut tentang praktik terbaik untuk memperbarui game-mu, lihat Memperbarui Game Milikmu - Praktik Terbaik.

Pengantar Sistem Konten SteamPipe

SteamPipe adalah sistem konten game/aplikasi yang menggerakkan Steam. Berikut adalah fitur-fitur SteamPipe:
  • Pengiriman konten yang efisien dan cepat.
  • Branch publik dan "beta" privat, memungkinkan pengujian beberapa build.
  • Pengelolaan build berbasis web sederhana: Meluncurkan build baru atau memulihkan build sebelumnya hanya dengan beberapa klik.
  • Kemampuan untuk melihat ukuran pembaruan suatu build sebelum build-nya dipublikasikan.
  • Kemampuan untuk berbagi konten antarbeberapa aplikasi.
  • Kemampuan untuk membuat disc penginstal dari konten publik atau beta.
  • Game/aplikasi tetap tersedia secara offline bahkan setelah pengunduhan pembaruan dimulai.
  • Semua konten selalu dienkripsi, dan versi non-aktifnya tidak akan terlihat oleh pelanggan.
  • Berfungsi sebagai SteamPipe Local Content Server yang dapat digunakan selama pengembangan.
CATATAN: SteamPipe mencakup beberapa konsep penting. Sebelum memulai, kamu harus memahami semua konsep yang dijelaskan dalam dokumentasi Aplikasi. Memiliki pemahaman dasar tentang cara kerja masing-masing komponen akan sangat membantu saat mengunggah produkmu ke Steam.

Struktur Konten Game - Praktik Terbaik


SteamPipe dirancang untuk pengunduhan instalasi game dan penerapan pembaruan yang efisien. Secara umum, SteamPipe cocok untuk berbagai struktur konten game. Namun, ada beberapa hal penting yang perlu diketahui mengenai optimasi dan menghindari situasi yang dapat menyebabkan inefisiensi.

Catatan: Jika game-mu menggunakan Unreal Engine, silakan lihat catatan khusus mengenai file paket ini di akhir bagian ini.

Pertama-tama, SteamPipe membagi setiap file menjadi potongan berukuran sekitar satu megabyte (MB). Setiap potongan kemudian dikompresi dan dienkripsi sebelum diunggah ke sistem pengiriman konten Steam. Potongan-potongan tersebut tetap terkompresi dan terenkripsi sampai diunduh ke setiap client, yang mana akan didekripsi dan didekompresi untuk ditempatkan di lokasi file yang sesuai.

Ketika SteamPipe memproses pembaruan untuk game yang ada, SteamPipe akan mencari potongan-potongan seperti itu yang cocok dengan build game yang sebelumnya. Dengan cara ini, idealnya hanya bagian yang baru atau yang dimodifikasi dari suatu file yang akan diubah menjadi potongan "baru", dan hanya potongan-potongan baru itulah yang harus diunduh oleh client untuk memperbarui game.

Banyak engine game yang menggunakan file "paket" untuk menggabungkan aset game, dan meningkatkan waktu muat dengan memungkinkan akses disk yang lebih efisien. Umumnya, ini bekerja dengan baik dengan SteamPipe. Namun, beberapa sistem file paket menggunakan atau mengaktifkan perilaku penggunaan yang dapat menyebabkan kendala. Efek dari kendala tersebut hampir selalu berupa pembaruan yang jauh lebih besar dari yang seharusnya. Efek lainnya adalah unduhan yang berjalan lebih cepat, tapi proses pembaruan berjalan lambat karena banyaknya jumlah I/O disk lokal yang diperlukan.

Jika game-mu menggunakan file paket, berikut adalah beberapa pedoman umum untukmu.

  • Pastikan perubahan aset dilokalkan sebanyak mungkin dalam file paket
  • Hindari mengacak urutan aset dalam file paket
  • Batasi ukuran file paket
  • Kelompokkan aset berdasarkan level/dunia/fitur ke masing-masing file paketnya, dan pertimbangkan untuk menambahkan file paket baru untuk pembaruan alih-alih memodifikasi yang sudah ada
  • Jangan sertakan nama file/stempel waktu build asli di setiap aset

Poin pertama di atas mengacu pada rentang byte yang berubah dalam sebuah file ketika satu aset dimodifikasi. Idealnya, data asetnya akan dimodifikasi dan/atau ukurannya akan diskalakan di lokasi yang sama dalam file paket. SteamPipe hanya akan membuat potongan baru untuk bagian file yang berisi data aset. Namun, semua file paket juga memerlukan semacam Daftar Isi (TOC) agar engine dapat menemukan data asetnya. Struktur TOC bisa sangat berpengaruh terhadap efisiensi patching SteamPipe. Sebaiknya ada satu atau kesatuan TOC di dekat awal atau akhir file. Karena aset lain mungkin menggeser posisi byte dalam file, entri TOC-nya juga akan berubah. Dalam situasi ini, SteamPipe akan membuat potongan baru untuk data aset yang dimodifikasi dan bagian TOC yang dimodifikasi.

Namun, pada beberapa engine game informasi TOC didistribusikan ke seluruh file. Atau lebih buruk lagi, menggunakan nilai offset byte absolut. Jadi, jika aset sebesar 3450 byte meningkat sebanyak 8 byte, maka nilai offset untuk semua aset setelahnya dalam file akan berubah. Meskipun setiap nilai offset hanya sebesar 4 atau 8 byte, perubahan ke angka 8 byte akan menghasilkan potongan 1 MB baru yang dibuat oleh SteamPipe. Ini dapat berakibat buruk, di mana bahkan mengubah beberapa aset kecil dalam file paket mengakibatkan client harus mengunduh lebih dari setengah keseluruhan file untuk pembaruan. Jika kamu mengetahui atau mencurigai bahwa struktur file-mu menyebabkan masalah ini, segera hubungi perwakilan Valve-mu. Kami memiliki algoritma build alternatif yang dapat membantu mengatasi masalah ini, meskipun ada konsekuensinya.

Selain itu, SteamPipe tidak mengetahui batasan aset dalam file paket. Jika aset sub-megabyte diacak, SteamPipe kemungkinan besar tidak dapat mendeteksi penyusunan ulang ini karena potongan 1 MB yang ditentukan sebelumnya tidak akan ada lagi dalam file. Jadi, jika dalam proses pembuatan pembaruan untuk game-mu kamu ingin mengoptimalkan waktu muat dengan menyusun ulang urutan aset dalam file paket, ketahuilah bahwa hal tersebut dapat menghasilkan unduhan yang sangat besar untuk pembaruannya. Kami menyarankan untuk melakukannya hanya jika hal tersebut dapat meningkatkan kinerja secara signifikan.

Selanjutnya, untuk memperbarui file paket pada perangkat client, SteamPipe membangun versi baru bersama dengan versi lama. Ketika semua file baru dibuat, maka pembaruan akan "dilakukan" dengan menghapus file lama dan memasukkan file baru. Artinya, untuk memperbarui file paket sebesar 25 GB, SteamPipe akan selalu membuat file 25 GB baru. Jika pembaruan hanya memerlukan 10 byte perubahan pada file-nya, SteamPipe perlu menyalin hampir seluruh 25 GB dari file lama ke file baru. Tergantung pada hardware penyimpanan client, proses ini bisa berjalan sangat lambat. Untuk alasan ini, kami memiliki dua rekomendasi.

Pertama: Batasi ukuran file paket. Mungkin satu atau dua gigabyte (GB) sudah lebih dari cukup untuk memungkinkan pembacaan disk yang efisien saat memuat game.

Kedua: Cakupan aset dalam satu file paket harus dibatasi. Batasi pada satu level game, atau fitur yang tidak dapat dibuka. Dengan begitu, pembaruan yang difokuskan hanya pada bagian tertentu dari game-mu tidak akan menyebabkan data dari bagian lain disalin ke perangkat client. Selain itu, saat menambahkan fungsionalitas/level/dll. yang baru, ini dapat dan kemungkinan harus ditempatkan di file paket barunya sendiri. Client yang mengunduh pembaruan ini hanya akan mengunduh file baru satu kali, sehingga menghindari masalah yang dijelaskan di atas dengan memodifikasi file paket.

Jika kamu ragu, gunakan alat seperti Beyond Compare untuk melihat perbedaan antara file biner lokal, sehingga kamu dapat membandingkan file paketmu. Pastikan bahwa perbedaan untuk aset yang diubah berukuran sesuai dengan yang kamu harapkan, dan bahwa tidak ada (mungkin lusinan atau ratusan) perubahan kecil yang tersebar di seluruh file. Jika hasil yang ditampilkan tidak terduga, periksa pengaturan alat file paketmu.

Kompresi: Karena Steam akan mengompresi semua data untuk diunggah/disimpan/diunduh, kami biasanya tidak menyarankan untuk menggunakan kompresi umum pada file paket. Namun, jika kamu khawatir tentang ukuran game-mu di disk, kami sarankan untuk mengompresi file paket. Selama kriteria di atas terpenuhi, itu akan berfungsi baik dengan SteamPipe. Secara khusus, kamu harus memastikan bahwa kompresi dilakukan secara terpisah untuk setiap aset bila memungkinkan. Kompresi apa pun yang melewati batasan aset akan menyebarkan perubahan dan mengharuskan client mengunduh lebih banyak data daripada yang seharusnya.

Enkripsi: Ini mirip dengan kompresi, yang kemungkinan besar tidak diperlukan dan memiliki risiko yang sama dengan yang disebutkan di atas.

Jika kamu mengikuti aturan ini, kamu akan meminimalkan ukuran patch dan hanya perlu mengunduh konten baru. Pelangganmu akan berterima kasih untuk itu, dan kamu akan dapat meningkatkan kualitas produkmu dengan mengirimkan lebih banyak pembaruan.

Jika pemaketan game-mu sepertinya tidak berinteraksi dengan baik dengan proses pembaruan SteamPipe, silakan hubungi perwakilan Valve-mu agar kami dapat mempertimbangkan untuk mengaktifkan fitur yang lebih canggih untuk membantumu.

Unreal Engine - Catatan Khusus

Beberapa versi Unreal Engine menggunakan aset "penyelarasan padding" (padding alignment) dalam file paket yang dapat berpengaruh besar terhadap ukuran pembaruan SteamPipe. Penyelarasan ini dapat menyebabkan pergeseran aset secara berjenjang saat membuat versi baru, terutama jika kompresi file paket diaktifkan. Menggunakan penyelarasan padding sebesar 1 MB (1048576) akan membantu memastikan bahwa penyelarasan ulang akan menggeser aset dengan kelipatan ukuran blok yang sama dengan yang digunakan SteamPipe untuk penghitungan delta.

Sebagai contoh, untuk mengubah atau menentukan keselarasan padding saat "membuat" file paket game-mu, kamu perlu mengubah satu baris di dalam file UnrealEngine/Engine/Source/Programs/AutomationTool/Win/WinPlatform.Automation.cs. File itu berisi fungsi GetPlatformPakCommandLine. Didalam fungsi itu, ubah baris ini:

string PakParams = " -patchpaddingalign=2048";

menjadi:

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

Dengan perubahan ini, kamu akan dapat mengaktifkan kompresi file paket dan tetap mendapatkan perilaku pembaruan SteamPipe yang dioptimalkan.

Unreal Engine adalah merek dagang atau merek dagang terdaftar Epic di AS dan di negara lain.

Video Tutorial Steamworks - Membangun Game Milikmu di SteamPipe

Tutorial ini memperkenalkan SteamPipe dan langkah-langkah dalam membuat aplikasi sampel untuk Steam menggunakan alat Steamworks.
https://www.youtube.com/watch?v=SoNH-v6aU9Q

Video Tutorial Steamworks - Menambahkan Platform dan Bahasa Baru

Tutorial ini memandumu dalam menambahkan platform dan bahasa baru ke game-mu dengan menambahkan depot ke aplikasimu.
https://www.youtube.com/watch?v=PShS32hcing

Rincian Teknis SteamPipe

SteamPipe menggunakan protokol HTTP untuk pengiriman konten. Karena pengunduhan terjadi menggunakan lalu lintas web normal, kecepatan pengunduhan akan meningkat jika terdapat cache HTTP pihak ketiga antara pelanggan dan server Steam. Konten dapat di-host oleh penyedia CDN eksternal, yang dapat dengan mudah ditambahkan ke jaringan konten kami. Sebagian besar firewall konsumen mengizinkan lalu lintas HTTP dan tidak akan memblokir unduhan.

SteamPipe memiliki algoritma patching yang efisien berdasarkan delta biner, yaitu hanya mengubah bagian yang dimodifikasi dari file konten yang ada. Ketika konten ini diperbarui, hanya delta ini yang perlu dikirim. Ini berarti transfer dari pengembang dan pengguna lebih kecil dan lebih cepat. Sebagian besar partner akan merasa bahwa penggunaan SteamPipe Local Content Server tidak diperlukan karena mereka dapat melakukan patch secara efisien pada build di branch privat.

Akun Build Steam

Sebelum kamu dapat membuat build apa pun di Steam, kamu harus memiliki akun Steam di akun Steamworks-mu yang memiliki perizinan "Edit Metadata Aplikasi" dan "Publikasikan Perubahan Aplikasi ke Steam". Untuk alasan keamanan, disarankan agar kamu memiliki akun khusus build hanya dengan kedua perizinan tersebut. Kamu dapat membuat akun Steam untuk keperluan ini di https://store.steampowered.com/join.

Setiap administrator akun Steamworks-mu dapat menambahkan akun Steam dan memberikan perizinan yang diperlukan. Info lebih lanjut tentang proses ini dapat ditemukan di dokumentasi Mengelola Akun Steamworks Milikmu. Contoh bentuk akun build adalah seperti ini:

create_build_account.png
Catatan: Jika ada akun Steam yang ingin merilis build untuk aplikasi yang sudah dirilis, perlu ada nomor telepon atau Aplikasi Seluler Steam yang dikaitkan ke akun tersebut. Metode tersebut akan digunakan untuk mengonfirmasi perilisan build untuk aplikasi yang sudah dirilis. Selain itu, jika ada perubahan terkait keamanan pada akun Steam (email, nomor telepon, dll.), maka kamu harus menunggu selama 3 hari sebelum kamu dapat merilis build untuk aplikasi yang sudah dirilis. Ini dilakukan untuk mencegah kemungkinan akun yang telah disusupi mengelola build aplikasimu.

Pengaturan Awal untuk Aplikasi SteamPipe Baru

Ikuti langkah-langkah berikut untuk menyiapkan aplikasi SteamPipe baru:
  1. Temukan AppID untuk aplikasimu (ini dapat dilakukan dengan memilih aplikasi di halaman berandamu di Steamworks)
  2. Buka halaman Pengaturan Instalasi Umum untuk aplikasimu.
  3. Tentukan setidaknya satu opsi peluncuran (jalurnya, dan jika perlu, argumen apa pun yang diperlukan untuk meluncurkan game-nya). Arahkan kursor ke (?) untuk mempelajari lebih lanjut tentang masing-masing kolom.

    Contoh di bawah ini menunjukkan 5 opsi peluncuran, dengan 2 untuk Windows, 2 untuk macOS, dan 1 untuk Linux.
    Opsi peluncuran ke-3 hanya akan muncul di Windows jika pengguna juga memiliki DLC yang disebutkan.

    updatedlaunchoptions_3.png
  4. Buka halaman Depot dan tambahkan depot seperlunya untuk aplikasi ini. Secara default, depot mungkin sudah dikonfigurasi untuk aplikasimu.
    1. Klik depot default dan ubah namanya menjadi nama yang sesuai dan mudah dikenali (seperti "Konten Base" atau "Konten Windows").
    2. Biarkan bahasa disetel ke [Semua bahasa] kecuali jika ini adalah depot khusus bahasa.
    3. Biarkan OS disetel ke [Semua OS] kecuali jika ini adalah depot OS khusus. Namun, jika aplikasinya adalah satu-untuk-semua, atau hanya untuk PC atau Mac, maka biarkan disetel ke [Semua OS]. Tentukan hanya untuk depot game OS khusus.
    4. Klik Tambahkan Depot Baru untuk membuat depot tambahan.
    5. Klik Simpan Perubahan untuk menyimpan perubahan yang dibuat.
  5. Setelah kamu selesai menyetel depotmu, publikasikan perubahan yang kamu buat dari halaman Publikasi.
  6. Depotmu yang baru disetel perlu disertakan dalam paket untuk memberimu kepemilikan atas depot tersebut. Setiap game di Steam harus memiliki paket Dev Comp yang secara otomatis diberikan ke akun yang terdaftar dalam grup penerbitmu.
    Kamu dapat menambahkan depot baru ke paket tersebut (dan/atau paket lain yang harus memiliki depot ini) di halaman Paket & DLC Terkait.
Catatan: Jika programmu berada di subfolder dari folder instalasi utama, tambahkan nama subfolder di kolom Program. Jangan gunakan garis miring atau titik di depan.
Catatan Platform: Seperti yang ditunjukkan di atas, aplikasi macOS dapat diluncurkan dengan menentukan bundel aplikasi (Game.app) atau skrip/biner (Game.app/Contents/MacOS/Game). Secara umum, lebih baik untuk menggunakan format bundel aplikasi karena itu memungkinkan macOS untuk menentukan parameter peluncuran dengan lebih tepat seolah-olah game diluncurkan secara manual di luar Steam.

Perlu diperhatikan bahwa saat ini aplikasi yang diluncurkan melalui bundel aplikasi pada perangkat Apple Silicon akan meluncurkan arsitektur terbaik yang tersedia di aplikasi, sedangkan peluncuran biner langsung akan menggunakan arsitektur yang sama dengan proses Steam (saat ini x86_64).

Menyiapkan SDK untuk unggahan SteamPipe

Unduh dan ekstrak versi terbaru dari SDK Steamworks di perangkat tempat kamu akan mengunggah build.

Alat SteamPipe dapat ditemukan di dalam SDK di folder alat yang berisi 2 subdirektori yang relevan.

Direktori ContentBuilder adalah tempat di mana konten game dan alat build SteamPipe berada. Direktori ini berisi subdirektori berikut:
  • builder - Direktori ini awalnya hanya berisi steamcmd.exe yang merupakan versi baris perintah Steam.
  • builder_linux - Versi linux dari steamcmd.
  • builder_osx - Versi macOS dari steamcmd.
  • content - Direktori ini berisi semua file game yang akan dibangun menjadi depot.
  • output - Direktori ini akan menjadi lokasi untuk log build, cache potongan, dan output perantara. CATATAN: Folder ini dapat dihapus atau dikosongkan kapan saja. Namun, setelah dihapus, waktu unggah berikutnya akan menjadi lebih lama.
  • scripts - Direktori ini adalah tempat di mana kamu akan menempatkan semua skrip build untuk membangun depot game-mu.
steampipebuilddir.png

Disarankan agar kamu menjalankan steamcmd.exe langsung di folder builder untuk platform-mu satu kali untuk mem-bootstrap sistem build-mu. Ini akan mengisi direktori builder-mu dengan semua file yang dibutuhkan untuk membangun depot.

Direktori ContentServer berisi alat untuk menjalankan SteamPipe Local Content Server milikmu sendiri jika kamu menginginkannya.

SteamCMD di macOS

Untuk mengaktifkan SteamCMD di macOS, kamu harus mengikuti langkah-langkah berikut:
  1. Dari terminal, telusuri ke tools\ContentBuilder\builder_osx
  2. Jalankan chmod +x steamcmd
  3. Ketik bash ./steamcmd.sh
  4. SteamCMD kemudian akan berjalan dan memperbarui ke build terbaru dan menampilkan prompt SteamCMD
  5. Ketik exit dan tekan Kembali untuk keluar dari prompt
Kemudian, kamu dapat mengikuti sisa dokumentasi ini (mengubah jalur jika perlu) untuk membuat depot dan file konfigurasi aplikasi untuk mengunggah kontenmu ke Steam.

Membuat File Konfigurasi Build SteamPipe

Untuk mengunggah file untuk aplikasimu dengan SteamPipe, kamu harus membuat skrip yang menjelaskan build-mu dan setiap depot yang disertakan di dalamnya. Contoh skrip yang ditampilkan di sini ada di folder Tools\ContentBuilder\scripts di SDK Steamworks.

Alat GUI SteamPipe

Jika kamu menggunakan Windows dan lebih memilih alat GUI untuk membantu membuat file konfigurasi dan mengunggah build, kamu dapat menggunakan SteamPipeGUI yang tersedia di folder alat di SDK Steamworks. Di dalam zip terdapat petunjuk tambahan untuk membantumu memulai.

Jika kamu memilih untuk menggunakan alat GUI, maka masih disarankan untuk membaca bagian berikut untuk membantumu memahami lebih lanjut cara kerja sistem SteamPipe.

Skrip Build Sederhana


Mari kita mulai dengan skrip build yang paling dasar. Pada contoh di bawah, terdapat game (AppID 1000) yang memiliki satu depot (ID Depot 1001) dan ingin mengunggah semua file dari folder "content" dan subfoldernya. Untuk itu, hanya satu skrip build diperlukan. Lihat "simple_app_build.vdf" yang ada dalam SDK:

"AppBuild" { "AppID" "1000" // AppID-mu "Desc" "Ini adalah skrip build sederhana" // deskripsi internal untuk build ini "ContentRoot" "..\content\" // folder konten root, relatif terhadap lokasi file ini "BuildOutput" "..\output\" // folder output build untuk log build dan file cache build "Depots" { "1001" // ID Depot-mu { "FileMapping" { "LocalPath" "*" // semua file dari folder contentroot "DepotPath" "." // dipetakan ke dalam root depot "recursive" "1" // sertakan semua subfolder } } } }

Sesuaikan AppID dan ID Depot untuk game-mu sesuai kebutuhan. Untuk mulai membangun build, kamu perlu menjalankan steamcmod dan meneruskan beberapa parameter:
tools\ContentBuilder\builder\steamcmd.exe +login <account_name> <password> +run_app_build ..\scripts\simple_app_build.vdf +quit

Berikut adalah yang akan terjadi saat membuat build SteamPipe:
  1. steamcmd.exe akan otomatis diperbarui ke versi terbaru.
  2. steamcmd.exe masuk ke backend Steam menggunakan akun Steam build-mu.
  3. Pembuatan aplikasi terdaftar di MDS (Master Depot Server), yang memberikan pengguna izin yang diperlukan untuk memodifikasi aplikasi ini.
  4. Untuk setiap depot yang disertakan dalam build aplikasi, daftar file dibuat berdasarkan file yang ada di folder konten dan aturan filter yang ditentukan di file konfigurasi build depot.
  5. Setiap file dipindai dan dibagi menjadi potongan-potongan kecil berukuran sekitar 1MB. Jika depot telah dibangun sebelumnya, partisi ini akan mempertahankan sebanyak mungkin potongan yang tidak berubah.
  6. Potongan file baru dikompresi, dienkripsi, dan kemudian diunggah ke MDS.
  7. Manifest akhir dibuat untuk versi depot ini, dan setiap manifest diidentifikasi oleh ID manifest unik 64-bit.
  8. Setelah semua depot diproses, MDS menyelesaikan pembuatan build aplikasi ini dan menetapkan ID Build global.
  9. Setelah build selesai, mungkin ada file *.csm and *.csd di dalam folder output build. File-file tersebut bersifat sementara dan dapat dihapus, tapi file-file tersebut dapat mempercepat waktu pembuatan build selanjutnya.


Setelah build selesai, kamu dapat melihatnya di halaman build aplikasimu. Jika mengikuti contoh di atas: https://partner.steamgames.com/apps/builds/1000. Di sana, kamu dapat memublikasikan build tersebut ke branch default atau branch beta apa pun dan pengguna akan dapat mengunduh pembaruan ini dalam beberapa menit.

Skrip Build Lanjutan


Jika aplikasimu memiliki banyak depot dengan aturan pemetaan file yang kompleks, kamu dapat membuat skrip build depot untuk setiap depot yang akan direferensikan oleh skrip build aplikasi. Pertama-tama, mari kita lihat parameter yang tersedia di skrip build aplikasi:

  • AppID - AppID game-mu. Akun partner Steam yang mengunggah membutuhkan perizinan "Edit Metadata Aplikasi"
  • Desc - Deskripsi hanya bisa kamu lihat di bagian "Build" pada panel Admin Aplikasi. Ini dapat diubah kapan pun setelah mengunggah build ke halaman "Build".
  • ContentRoot - Folder root dari file game-mu, yang dapat berupa jalur absolut atau relatif terhadap file skrip build.
  • BuildOutput - Direktori ini akan menjadi lokasi untuk log build, manifest depot, cache potongan, dan output perantara. Untuk kinerja terbaik, gunakan disk terpisah untuk output build-mu. Ini membagi beban kerja I/O disk, sehingga membiarkan disk root kontenmu menangani permintaan baca dan disk output-mu menangani permintaan tulis.
  • Preview - Jenis build ini hanya mengeluarkan output log dan file manifest ke folder output build. Membangun build pratinjau (preview) adalah cara yang baik untuk memeriksa skrip unggahanmu dan memastikan bahwa pemetaan file, filter, dan properti berfungsi sebagaimana mestinya.
  • Local - Atur ini ke jalur htdocs SteamPipe Local Content Server (LCS). Build LCS menempatkan konten hanya di server HTTP milikmu sendiri dan memungkinkanmu untuk menguji instalasi game-mu menggunakan Steam Client.
  • SetLive - Nama branch beta yang akan secara otomatis ditetapkan setelah build berhasil dibuat, dan tidak ada jika kosong. Perlu diingat bahwa branch "default" tidak dapat dipublikasikan secara otomatis. Itu harus dilakukan melalui panel Admin Aplikasi.
  • Depots - Bagian ini berisi semua pemetaan file, filter, dan properti file untuk setiap depot atau mereferensikan file skrip terpisah untuk setiap depot

Contoh skrip build aplikasi "app_build_1000.vdf" yang menggunakan semua opsi:
"AppBuild" { "AppID" "1000" // AppID-mu "Desc" "Deskripsi build-mu di sini" // deskripsi internal untuk build ini "Preview" "1" // jadikan ini hanya sebagai build pratinjau, tanpa ada yang diunggah "Local" "..\..\ContentServer\htdocs" // masukkan konten di server konten lokal, alih-alih mengunggah ke Steam "SetLive" "AlphaTest" // publikasikan build ini di branch beta "ContentRoot" "..\content\" // folder konten root yang relatif terhadap file skrip ini "BuildOutput" "D:\build_output\" // tempatkan cache build dan file log di drive berbeda untuk kinerja yang lebih baik "Depots" { // petunjuk pemetaan file untuk setiap depot berada di file skrip terpisah "1001" "depot_build_1001.vdf" "1002" "depot_build_1002.vdf" } }

Skrip build aplikasi ini mereferensikan dua file skrip build depot yang menentukan semua pemetaan dan properti file. Petunjuk berikut tersedia dalam skrip build depot (dan juga jika bagian tersebut disertakan langsung ke skrip build aplikasi).

  • DepotID - ID Depot untuk bagian ini
  • ContentRoot - Memungkinkanmu untuk menimpa folder ContentRoot dari skrip build aplikasi secara opsional untuk setiap depot
  • FileMapping - Untuk memetakan satu file atau satu set file dari root konten lokal ke depotmu. Mungkin ada beberapa pemetaan file yang menambahkan file ke depot. Parameter LocalPath adalah jalur alternatif ke folder root konten dan mungkin berisi karakter wildcard seperti "?" atau "*". Juga akan diterapkan pada file yang cocok dalam subfolder jika Recursive diaktifkan. Parameter DepotPath menentukan di mana file yang dipilih akan muncul di depot (cukup gunakan "." jika tidak ada pemetaan khusus)
  • FileExclusion – Akan mengecualikan file yang dipetakan lagi dan juga dapat berisi karakter wildcard seperti "?" atau "*"
  • InstallScript - Akan menandai file sebagai skrip instalasi/doclink] dan akan menandatangani file selama proses pembuatan build. Steam Client tahu untuk menjalankannya bagi aplikasi apa pun yang terpasang pada depot ini.
  • FileProperties - Akan menandai file dengan penanda khusus:
    • userconfig - File ini dimodifikasi oleh pengguna atau game. Ini tidak dapat ditimpa oleh pembaruan dan tidak akan memicu masalah verifikasi jika berbeda dari versi file sebelumnya.
    • versionedconfig - Mirip dengan userconfig. Namun, jika file diperbarui di depot, file akan ditimpa secara lokal ketika game milik pengguna diperbarui. Hanya perbarui file di depot bila ada perubahan format atau perbaikan bug yang memang diperlukan.

Contoh skrip build depot depot_build_1002.vdf yang menunjukkan penggunaan semua opsi:
"DepotBuild" { "DepotID" "1002" "ContentRoot" "C:\content\depot1002" // timpa ContentRoot dari skrip build aplikasi "FileMapping" { // semua file dan folder sumber dalam ".\bin" akan dipetakan ke dalam folder ".\executables" di depot "LocalPath" "bin\*" "DepotPath" "executables\" "Recursive" "1" // sertakan semua subfolder } "FileMapping" { // timpa file audio dalam \\audio dengan versi bahasa Jerman "LocalPath" "localization\german\audio\*" "DepotPath" "audio\" } "FileMapping" { // salin skrip instalasi dari versi bahasa Jerman ke dalam folder root depot "LocalPath" "localization\german\german_installscript.vdf" "DepotPath" "." } "FileExclusion" "bin\server.exe" // kecualikan file ini "FileExclusion" "*.pdb" // kecualikan semua file .PDB di mana pun "FileExclusion" "bin\tools*" // kecualikan semua file dari bin\tools\ "InstallScript" "localization\german\german_installscript.vdf" "FileProperties" { "LocalPath" "bin\setup.cfg" "Attributes" "userconfig" // file ini akan dimodifikasi selama runtime } }

CATATAN: Kamu dapat menamai skrip ini sesukamu, tapi kami menggunakan nama app_build_<AppID> dan depot_build_<DepotID> untuk konsistensi. Jika kamu akan membangun aplikasi di perangkat ini, sebaiknya buatlah subdirektori dalam direktori skripmu untuk setiap aplikasi, untuk membantu mengatur skrip build dari setiap aplikasi.

Menggunakan SteamPipe untuk CI/CD


Untuk menyiapkan steamcmd untuk integrasi berkelanjutan (CI), atau hanya pada perangkat atau perangkat virtual yang akan sering diinstal ulang, kamu perlu menyertakan file konfigurasi yang berisi token login-mu. Ikuti langkah-langkah berikut untuk menyimpan token login awalmu dengan benar:

  1. Jalankan "steamcmd.exe +login" <username> pada perangkat yang akan menjalankan build
  2. Masukkan kata sandimu dan token SteamGuard
  3. Ketik "info", dan kamu akan melihat akunmu tercantum sebagai "terhubung"
  4. Ketik "quit"
  5. Untuk setiap proses selanjutnya, jangan masukkan kata sandi. Cukup jalankan "steamcmd.exe +login <username>"
  6. Pastikan file konfigurasi yang disimpan di <Steam>\config\config.vdf disimpan dan dipertahankan di setiap proses, karena file ini mungkin bisa diperbarui setelah login berhasil

CATATAN: Jika kamu login lagi dan memberikan kata sandimu, token SteamGuard baru akan dihasilkan dan diperlukan untuk login.

Mengelola Pembaruan

Setelah aplikasimu dirilis ke pelanggan, pelangganmu akan menerima build yang ditandai sebagai build Default. Saat mengunggah build baru, ada baiknya untuk selalu mengujinya sebelum merilisnya ke pelanggan. Untuk info lebih lanjut tentang cara untuk melakukannya, lihat Pengujian di Steam.

Melakukan Debug pada Masalah Build

Jika build-mu gagal, carilah info terkait erornya di direktori output, dan bukan di konsol tempat skrip build dijalankan. Sebagian besar info terkait eror bisa ditemukan di file *.log.
Kamu dapat menggunakan perintah Steam Client berikut ini dan file lokal pengguna untuk men-debug masalah:
  • "app_status [appid]" - Menampilkan status aplikasi saat ini pada client ini.
  • "app_info_print [appid]" - Menampilkan konfigurasi Steamworks terkini untuk game ini (depot, opsi peluncuran, dll.).
  • "app_config_print [appid]" - Menampilkan konfigurasi pengguna terkini untuk game ini (bahasa saat ini, direktori instalasi, dll.).
  • file "logs\content_log.txt" - Mencantumkan semua aktivitas dan eror SteamPipe yang tercatat.
  • file "steamapps\appmanifest_[appid].acf" - Menampilkan status instalasi terkini dari aplikasi ini (KeyValues).

Membuat Disk Instalasi Ritel

Untuk membuat disk instalasi ritel untuk game-game SteamPipe, pertama-tama kamu harus menyiapkan file proyek build.
Dalam contoh ini, file SKU disebut dengan "sku_goldmaster.txt":
"sku" { "name" "Penginstal Game Uji" "appid" "202930" "disk_size_mb" "640" "included_depots" { "1" "202931" "2" "202932" } }
Beberapa tip untuk diperhatikan:
  • Buat folder baru untuk menulis image disk ritel, misalnya "D:\retail_disks". Hanya depot di bagian included_depots yang ditambahkan; tidak ada lagi bagian pengecualian.
  • Kamu dapat menggunakan Steam.exe (dengan parameter baris perintah -dev dan -console) atau steamcmd.exe untuk membuat image penginstal. Dalam kedua kasus tersebut, gunakan perintah "build_installer".
  • Login dengan akun Steam yang memiliki game-nya dan semua depot yang ingin kamu masukkan ke disk ritel. Akunnya tidak harus memiliki perizinan khusus, sehingga siapa pun dapat membuat disk penginstal.
  • Jika kamu menggunakan Steam.exe, hentikan semua unduhan lainnya.
  • Buka halaman konsol dan jalankan perintah build_installer:
    build_installer sku_goldmaster.txt "D:\retail_disks"
    Pembuatan build dapat memakan waktu cukup lama karena semua depot akan diunduh ulang untuk pertama kalinya.
  • Jika kamu membuat GM (Gold Master) menggunakan server konten lokal, jalankan:
    @localcontentserver "webserver"
    build_installer sku_goldmaster.txt "D:\retail_disks" local
    Output-nya mengacu pada "Backup" karena backup "Disk Instalasi Ritel" dan backup lokal game pada dasarnya sama.
  • Setelah kamu melihat "Backup selesai untuk AppID...", berarti image disk instalasinya sudah siap. Kamu dapat menemukan rincian selengkapnya tentang build backup di logs\backup_log.txt.
  • Akan ada folder baru (Disk_1, Disk_2, dan seterusnya) di "D:\retail_disks", yang masing-masingnya tidak lebih besar dari 640 MB, sebagaimana ditentukan dengan "disk_size_mb". Setiap folder disk berisi file "sku.sis" dan .csd dan .csm untuk masing-masing depot. Depot yang lebih besar tersebar di beberapa disk. Semua konten disk instalasi ritel selalu dienkripsi (tidak seperti file lokal backup game). Salin file instalasi SDK GM (setup.exe, setup.ini, dll.) ke dalam folder disk pertamamu, kemudian disk instalasi ritelmu pun sudah jadi.
  • Saat membuat GM untuk macOS, pastikan untuk membuka image goldmaster/disk_assets/SteamRetailInstaller.dmg di Mac. Kemudian, pilih aplikasi yang ada di sana dan salin ke root mediamu. Kamu mungkin ingin mengganti nama aplikasi penginstal, memodifikasi ikon, dan membuat hanya penginstal yang muncul dalam jendela.
  • Saat membuat GM multidisk untuk macOS, pastikan nama volume untuk setiap disk cocok. Nama volume akan menjadi bagian dari jalur pemasangan, dan jika namanya tidak cocok, maka penginstal tidak akan dapat menemukan disk selanjutnya.

Membuat penginstal ritel dari branch beta secara opsional

Proses di atas akan menghasilkan penginstal ritel berdasarkan branch default. Jika kamu perlu membuat penginstal berdasarkan branch beta, pertama-tama kamu harus membuat branch beta dengan nama "baseline". Kemudian, gunakan perintah berikut untuk membuat build dari branch 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

Menginstal DLC dari penginstal ritel

Dalam beberapa kasus, kamu mungkin ingin membuat penginstal ritel yang menyertakan paket DLC. Jika begitu, dibutuhkan hanya beberapa perubahan dalam proses untuk membuat penginstal.
Di "sku_goldmaster.txt", sertakan AppID DLC pada bagian "included_depots". Setelah kamu menjalankan proses "build_installer", temukan file sku.sis untuk penginstalnya dan buka itu dengan editor teks.
Tambahkan AppID DLC pada bagian "apps". Sebagai contoh, jika ada game dengan AppID 1000 dan AppID DLC 1010, bagian "apps" akan disesuaikan seperti ini:
"apps" { "0" "1000" "1" "1010" }
Ini akan memastikan bahwa Steam memeriksa kepemilikan DLC dan meminta key kepada pengguna jika DLC-nya tidak dimiliki oleh akun yang digunakan untuk login ke Steam.

Membuat penginstal ritel untuk beberapa AppID dalam satu disk/paket instalasi

Untuk membuat GM yang berisi beberapa aplikasi SteamPipe. Buat setiap penginstal aplikasi satu per satu, tapi arahkan semuanya ke folder output yang sama. Setiap build akan menggabungkan diri dengan image instalasi yang sudah ada.

Mengustomisasi disk instalasi Ritel

Lihat Mengustomisasi gold master untuk rincian selengkapnya tentang mengustomisasi disk instalasi ritel.

Memuat Game sebelum Rilis

Secara default, semua konten di semua disk ritel dan di semua server konten akan selalu dienkripsi. Menggunakan mode pramuat berarti pemilik game dapat mengunduh kontennya, tapi konten akan tetap terenkripsi di disk pengguna dan tidak dapat dimainkan. Setelah game dirilis secara resmi, Steam akan mendekripsi konten pramuat tersebut sehingga pengguna dapat memainkan game-nya.

Menggunakan mode pramuat disarankan dalam kasus-kasus berikut ini:
  • Menyebarkan disk ritel dengan key produk sebelum game benar-benar tersedia (pembajakan di hari H).
  • Game yang menjalankan prapesan dan ukurannya lebih besar dari 20 GB.

Silakan kirim tiket ke Publikasi Steam jika kamu merasa membutuhkan pramuat untuk game-mu.

Membuat DLC

DLC dibuat sebagai depot dari base game. Lihat dokumentasi DLC untuk info lebih lanjut.

Troubleshoot SteamPipe

"Login Failure: Account Login Denied Failed" ketika login melalui steamcmd

Penyebab: Kemungkinan SteamGuard mencegah login. Solusi:
  • Periksa email yang terkait dengan akun yang kamu coba gunakan untuk login dan cari email dari Bantuan Steam. Salin kode dari email tersebut.
  • Jalankan steamcmd ini: set_steam_guard_code <code>
  • Coba login kembali dari steamcmd: Steam>login <buildaccount> <password>

Troubleshoot Umum untuk Masalah Unduhan

  • Restart komputer, modem, router, dll.
  • Verifikasi pengaturan firewall. Sistem baru membutuhkan port 80 (HTTP) dan semua port Steam lainnya yang tercantum di sini.
  • Nonaktifkan sementara program Anti-Virus atau Spam-Blocker lokal.
  • Periksa wilayah pengunduhan Steam pada Pengaturan->Unduhan. Seharusnya akan sesuai dengan lokasimu.
  • Hentikan pengunduhan, hapus instalan, dan instal ulang game (hapus cache manifest).
  • Keluar dari Steam, hapus dua folder appcache dan depotcache dari dalam folder instalasi Steam.
  • Coba untuk mengatur wilayah pengunduhan Steam-mu ke lokasi lain yang jauh. Ini mungkin akan bekerja jika server konten di dekatmu mentransmisikan data dengan buruk.

Build Mac dan/atau Linux saya tidak menginstal file apa pun. Kenapa?

Jika kamu menguji instalasi game atau aplikasimu melalui Steam di beberapa platform, kamu mungkin akan mengalami situasi di mana build-nya terinstal di Windows, tapi tidak tidak menginstal file di Mac atau Linux meskipun proses SteamPipe-mu dikonfigurasi untuk mengunggah depot Mac dan/atau Linux. Ada sebuah langkah yang mudah terlupakan, yaitu menambahkan depot-depot alternatif ke paket yang sedang diinstal. Kamu dapat memeriksa depot apa saja yang ada di dalam paket melalui langkah-langkah berikut ini:
  1. Arahkan ke halaman Admin Aplikasimu
  2. Dari bagian Lihat Item Terkait, klik Semua Paket, DLC, Demo, dan Alat yang Terkait.
  3. Klik pada judul paket yang kamu coba unduh
  4. Tinjau bagian Depot Termasuk
  5. Gunakan Tambahkan/Hapus Depot untuk memastikan set depot yang benar telah ditetapkan ke paket
Ada sejumlah utas diskusi tentang ini yang juga dapat membantu:

Menjalankan steamcmd.exe memunculkan eror berikut: "SteamUpdater: Error: Steam needs to be online to update. Please confirm your network connection and try again".

Solusi: Buka Opsi Internet->Koneksi->Pengaturan LAN dan centang Deteksi Pengaturan secara Otomatis.

Menjalankan build aplikasi memunculkan eror berikut: "ERROR! Failed 'DepotBuild for scriptname.vdf' - status = 6"

Kemungkinan Penyebab:
  • Akun tidak memiliki perizinan untuk aplikasi.
    • Periksa apabila AppID-nya sudah benar di app_build.vdf.
    • Periksa apabila akun build memiliki perizinan yang tepat ke AppID-nya.
  • Steamcmd tidak dapat menemukan konten depot.
    • Periksa apabila nilai "contentroot" di skrip app_build adalah jalur yang valid, relatif terhadap lokasi file skrip.
    • Periksa apabila nilai "LocalPath" di skrip depot_build adalah jalur yang valid, relatif terhadap skrip app_build. Pastikan jalurnya berisi konten yang tepat.

Menjalankan build aplikasi memunculkan eror berikut: "ERROR! Failed to get application info for app NNNNN (check login and subscription)"

Ini berarti Steam tidak dapat mengambil informasi tentang aplikasi, baik karena aplikasinya tidak ada atau karena penggunanya tidak memiliki akses ke aplikasinya.
  • Periksa apabila NNNNN adalah AppID yang kamu tetapkan untuk aplikasinya.
  • Periksa apabila AppID-nya sudah benar di app_build.vdf.
  • Jika itu adalah AppID baru, periksa apabila konfigurasi admin aplikasi Steamworks telah dipublikasikan. Aplikasi baru harus memiliki direktori instalasi SteamPipe serta depot, yang keduanya dapat ditemukan di Edit Pengaturan Steamworks. Direktori instalasi ada di Instalasi Umum pada tab Instalasi, dan Depot dapat ditemukan di tab SteamPipe. Semua perubahan yang dipublikasikan dilakukan melalui tab publikasi.
  • Jika semuanya sudah terlihat benar, pastikan akunmu memiliki AppID-nya.

"An error occurred while installing [AppName] (Invalid content configuration)" saat peluncuran

Kemungkinan Penyebab:

Saya tidak ingat soal perintah steamcmd atau cara kerjanya

Gunakan perintah "find" di steamcmd untuk mencari perintah steamcmd apa pun. Ini akan membandingkan setiap bagian dari nama perintah dan mencantumkan sintaksis perintah.
Steam>find build_installer ConVars: Commands: build_installer : <project file> <target folder> <beta key> <beta pwd>