[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KR8SW3FBK46DRCXRWPBCGX":3,"skill-same:01M6KR8SW3FBK46DRCXRWPBCGX":90},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6KR8SW3FBK46DRCXRWPBCGX","export-pipeline",null,"Use when exporting and distributing Godot games — export presets, platform settings, CI\u002FCD with GitHub Actions","jame581\u002FGodotPrompter","jame581","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F21112138?v=4","01M6KR3KEQ9Z30WVJRR2E2ZVXE","Jan Mesarč","01M6KR3KJVRMPDSMASQPBCBVK3",964,"MIT","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fexport-pipeline\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"pipeline","export pipeline","export","actions","ci","github actions","CI\u002FCD","platform","games","use","with","github","settings","cd","godot","when","2026-11-10 10:12:30",false,"---\nname: export-pipeline\ndescription: Use when exporting and distributing Godot games — export presets, platform settings, CI\u002FCD with GitHub Actions\n---\n\n# Export Pipeline in Godot 4.3+\n\nAll examples target Godot 4.3+ with no deprecated APIs. GDScript is shown first, C# follows where applicable.\n\n> **Related skills:** **godot-testing** for CI\u002FCD test integration, **godot-optimization** for pre-export performance checks, **responsive-ui** for platform-specific resolution settings, **mobile-development** for Android\u002FiOS export specifics, **web-export** for browser builds and hosting.\n\n---\n\n## 1. Export Presets\n\n### Creating Presets in the Editor\n\nOpen **Project → Export**, click **Add…**, and select the target platform. Each preset maps to one entry in `export_presets.cfg`. You can create multiple presets for the same platform (e.g., a debug build and a release build for Windows).\n\nRequired one-time setup per platform:\n- **Export Templates** must be downloaded via **Editor → Export Templates**.\n- Platform-specific toolchains (Android SDK, Xcode, etc.) must be installed separately.\n\n### export_presets.cfg\n\nGodot writes `export_presets.cfg` to the project root. Commit this file: options marked secret (keystore and codesign paths and passwords, the encryption key) go to `.godot\u002Fexport_credentials.cfg` instead, which must **never** be committed. In CI, supply them via env vars such as `GODOT_ANDROID_KEYSTORE_RELEASE_PASSWORD`.\n\nExample preset structure (Windows release):\n\n```ini\n[preset.0]\n\nname=\"Windows Desktop\"\nplatform=\"Windows Desktop\"\nrunnable=true\ndedicated_server=false\ncustom_features=\"\"\nexport_filter=\"all_resources\"\ninclude_filter=\"\"\nexclude_filter=\"\"\nexport_path=\"build\u002Fwindows\u002FMyGame.exe\"\nencryption_include_filters=\"\"\nencryption_exclude_filters=\"\"\nencrypt_pck=false\nencrypt_directory=false\n\n[preset.0.options]\n\ncustom_template\u002Fdebug=\"\"\ncustom_template\u002Frelease=\"\"\ndebug\u002Fexport_console_wrapper=1\nbinary_format\u002Fembed_pck=true\ntexture_format\u002Fs3tc_bptc=true\ntexture_format\u002Fetc2_astc=false\nbinary_format\u002Farchitecture=\"x86_64\"\ncodesign\u002Fenable=false\ncodesign\u002Ftimestamp=true\ncodesign\u002Ftimestamp_server_url=\"\"\ncodesign\u002Fdigest_algorithm=1\ncodesign\u002Fdescription=\"\"\ncodesign\u002Fcustom_options=PackedStringArray()\napplication\u002Ficon=\"\"\napplication\u002Fconsole_wrapper_icon=\"\"\napplication\u002Ficon_interpolation=4\napplication\u002Ffile_version=\"\"\napplication\u002Fproduct_version=\"\"\napplication\u002Fcompany_name=\"\"\napplication\u002Fproduct_name=\"\"\napplication\u002Ffile_description=\"\"\napplication\u002Fcopyright=\"\"\napplication\u002Ftrademarks=\"\"\napplication\u002Fexport_angle=0\napplication\u002Fexport_d3d12=0\napplication\u002Fd3d12_agility_sdk_multiarch=true\nssh_remote_deploy\u002Fenabled=false\nssh_remote_deploy\u002Fhost=\"user@host_ip\"\nssh_remote_deploy\u002Fport=\"22\"\nssh_remote_deploy\u002Fextra_args_ssh=\"\"\nssh_remote_deploy\u002Fextra_args_scp=\"\"\nssh_remote_deploy\u002Frun_script=\"#!\u002Fusr\u002Fbin\u002Fenv bash\\nexport DISPLAY=:0\\n\\\"{temp_dir}\u002F{exe_name}\\\" {cmd_args}\"\nssh_remote_deploy\u002Fcleanup_script=\"#!\u002Fusr\u002Fbin\u002Fenv bash\\nkill $(pgrep -x -f \\\"{temp_dir}\u002F{exe_name} {cmd_args}\\\")\\nrm -rf \\\"{temp_dir}\\\"\"\n```\n\n> The editor rewrites `export_presets.cfg` whenever a preset changes. Do not hand-edit it while the editor is open.\n\n> ⚠️ **Changed in Godot 4.7:** The \"runnable\" flag moved out of export presets — `runnable=` (shown in the example above for 4.3–4.6) is no longer a per-preset property in `export_presets.cfg`; a 4.7 editor writes a top-level `[runnable_presets]` section (platform name → preset name) in the same file, and still reads the legacy key. Don't be surprised when the line disappears from the file after saving in a 4.7 editor. See [GH-114930](https:\u002F\u002Fgithub.com\u002Fgodotengine\u002Fgodot\u002Fpull\u002F114930).\n\n> **Godot 4.7+:** Sparse PCK exports (patch packs) support encrypting the file index, complementing the existing `encrypt_pck` \u002F `encrypt_directory` preset options. ([GH-113920](https:\u002F\u002Fgithub.com\u002Fgodotengine\u002Fgodot\u002Fpull\u002F113920))\n\n---\n\n## 2. Platform-Specific Settings\n\n| Platform  | Key Setting \u002F Consideration                                                                                                                      |\n|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------|\n| **Windows** | Set `application\u002Ficon` (.ico file). Codesigning requires a `.pfx` certificate; set `codesign\u002Fenable=true` and supply `codesign\u002Fidentity` + `codesign\u002Fpassword` via env vars. Without codesigning, Windows SmartScreen will warn users. |\n| **Linux**   | No codesigning required. The binary is written executable (0755); re-run `chmod +x` if an upload or archive step drops the bit. Ship as a tarball or AppImage for distribution. |\n| **macOS**   | Requires notarization for Gatekeeper to allow launch without warning. Set `codesign\u002Fcodesign` (rcodesign, or Xcode codesign on a Mac) and `notarization\u002Fnotarization` (rcodesign or Xcode notarytool); the export submits for notarization. `Info.plist` entries are `application\u002F*` (bundle ID, version) and `privacy\u002F*` (usage descriptions). |\n| **Web**     | Compatibility renderer only, and no C#. The preset's `variant\u002Fthread_support` is off by default (Godot 4.3+), so the build runs on any static host; a threaded build needs `Cross-Origin-Opener-Policy: same-origin` and `Cross-Origin-Embedder-Policy: require-corp` headers. Exported output is a `.html` + `.js` + `.wasm` + `.pck` bundle. Details: **web-export**. |\n| **Android** | Requires a keystore for release signing. Set `keystore\u002Frelease` to the `.keystore` path and supply `keystore\u002Frelease_user` + `keystore\u002Frelease_password` via env vars. Declare permissions in the preset under `permissions\u002F*`. Set `package\u002Funique_name` to a reverse-DNS string (e.g., `com.studio.mygame`). |\n| **iOS**     | Requires a valid Apple provisioning profile (`.mobileprovision`). Set `application\u002Fbundle_identifier`, `application\u002Fcode_sign_identity_release`, and `application\u002Fprovisioning_profile_uuid_release`. Distribution builds require an App Store distribution certificate. |\n\n> **Godot 4.8+:** Windows, Linux and macOS presets gain `debug\u002Fexport_debug_symbols`, which ships a `.debugsymbols` file (`.dSYM` on macOS) beside the executable; it needs a same-named symbols file next to the export template. Android gains `gradle_build\u002Fminification` (R8, release builds).\n\n---\n\n## 3. Export from CLI\n\nRun Godot in headless mode to export without opening the GUI. This is the standard approach for CI\u002FCD.\n\n### Release Export\n\n```bash\ngodot --headless --export-release \"Windows Desktop\" build\u002Fwindows\u002FMyGame.exe\n```\n\n### Debug Export\n\n```bash\ngodot --headless --export-debug \"Windows Desktop\" build\u002Fwindows\u002FMyGame.exe\n```\n\n### Export .pck Only (no executable)\n\nUse `--export-pack` when you only want to ship updated game data alongside a fixed engine binary (e.g., DLC or patch distribution):\n\n```bash\ngodot --headless --export-pack \"Windows Desktop\" build\u002Fwindows\u002FMyGame.pck\n```\n\n> **Godot 4.7+:** When exporting patch PCKs for Android, an APK or AAB can be provided as the base pack, extending PCK-patching workflows to Android builds. ([GH-116553](https:\u002F\u002Fgithub.com\u002Fgodotengine\u002Fgodot\u002Fpull\u002F116553))\n\n### Packing In-Memory Data (Godot 4.7+)\n\n`PCKPacker.add_file_from_buffer(target_path, data, encrypt = false)` packs a `PackedByteArray` straight into a PCK — no temp file on disk — which is handy when generating patch content from a build script:\n\n```gdscript\nvar build_info: String = \"v\" + ProjectSettings.get_setting(\"application\u002Fconfig\u002Fversion\", \"dev\")\nvar packer := PCKPacker.new()\npacker.pck_start(\"user:\u002F\u002Fpatch_1.pck\")\npacker.add_file_from_buffer(\"res:\u002F\u002Fdata\u002Fbuild_info.txt\", build_info.to_utf8_buffer())\npacker.flush()\n```\n\n```csharp\nstring buildInfo = \"v\" + ProjectSettings.GetSetting(\"application\u002Fconfig\u002Fversion\", \"dev\").AsString();\nvar packer = new PckPacker();\npacker.PckStart(\"user:\u002F\u002Fpatch_1.pck\");\npacker.AddFileFromBuffer(\"res:\u002F\u002Fdata\u002Fbuild_info.txt\", buildInfo.ToUtf8Buffer());\npacker.Flush();\n```\n\n### Key CLI flags\n\n| Flag | Purpose |\n|------|---------|\n| `--headless` | No display server; required for server\u002FCI environments |\n| `--export-release \"Preset Name\" path` | Export using release template |\n| `--export-debug \"Preset Name\" path` | Export using debug template |\n| `--export-pack \"Preset Name\" path` | Export .pck resource pack only |\n| `--quit-after N` | Quit after N main-loop iterations (rarely needed for export) |\n\n> The preset name in the CLI flag must match `name=` in `export_presets.cfg` exactly, including capitalisation and spaces.\n\n---\n\n## 4. CI\u002FCD with GitHub Actions\n\nRun `godot --headless --export-release` inside a GitHub Actions matrix that builds Windows, Linux, and Web artifacts on every push and tagged release. Use [`chickensoft-games\u002Fsetup-godot@v2`](https:\u002F\u002Fgithub.com\u002Fchickensoft-games\u002Fsetup-godot) to install the engine + export templates (set `use-dotnet: true` for C# projects). Inject the version from `git describe` before export so `application\u002Fconfig\u002Fversion` is correct in the binary.\n\nSee [references\u002Fci-cd-github-actions.md](references\u002Fci-cd-github-actions.md) for the full `.github\u002Fworkflows\u002Fexport.yml` with matrix presets, artifact upload, and Linux executable bit handling.\n\n---\n\n## 5. Versioning\n\nSet the version in `application\u002Fconfig\u002Fversion` and read it at runtime with `ProjectSettings.get_setting()`. To inject a version from git at export time, run a `--script` tool (a script extending `SceneTree`) that calls `git describe --tags --always --dirty` through `OS.execute()` before the export step. Tags follow Semantic Versioning (`v1.2.3`).\n\n> See [references\u002Fversioning.md](references\u002Fversioning.md) for the runtime version label, the `inject_version.gd` tool, and the tag convention.\n\n---\n\n## 6. Distribution: itch.io and Steam\n\n**itch.io** uses the [Butler](https:\u002F\u002Fitch.io\u002Fdocs\u002Fbutler\u002F) CLI: `butler push build\u002Fwindows\u002F my-studio\u002Fmy-game:windows --userversion \"$VERSION\"`. Channel names follow a convention (`windows`, `linux`, `macos`, `web`, `android`). In CI, the [`Ayowel\u002Fbutler-to-itch@v1`](https:\u002F\u002Fgithub.com\u002FAyowel\u002Fbutler-to-itch) action pushes all artifacts at once; store the API key as the `BUTLER_API_KEY` secret.\n\n**Steam** requires three pieces: the Steamworks SDK (non-redistributable, keep out of public repos), the [GodotSteam](https:\u002F\u002Fgodotsteam.com\u002F) addon for engine bindings, and depot configurations driven by `steamcmd +run_app_build app_build.vdf`. Steam integration is outside the export pipeline itself.\n\nSee [references\u002Fdistribution-itch-steam.md](references\u002Fdistribution-itch-steam.md) for full butler install instructions, channel naming table, the `deploy-itch` GitHub Actions job, and the Steam component breakdown. For the release side — the 21-day app-fee wait, the two-week Coming Soon minimum, review times, store asset sizes, demo and Next Fest deadlines, and discount rules — see [references\u002Fsteam-release-planning.md](references\u002Fsteam-release-planning.md).\n\n---\n\n## 7. Shader Baker (Godot 4.5+)\n\nGodot 4.5 introduces the **Shader Baker**, an export-time tool that pre-compiles shaders for the target platform. It mainly shortens first-launch load time, most on Direct3D 12 and Metal where shader conversion is slow. It does not remove pipeline-compilation stutter, which still needs pipeline precompilation.\n\n### Enabling\n\nIn **Project → Export**, open a preset and locate the **Shader Baker** section. Tick **Enabled** (`shader_baker\u002Fenabled`, off by default). There is no backend picker: it bakes for the target platform's `rendering\u002Frendering_device\u002Fdriver` setting, on the Forward+ and Mobile renderers only.\n\n> The Shader Baker makes exports slightly slower and the PCK a few megabytes larger. The baked shaders are embedded in the `.pck` file.\n\n### Impact by Platform\n\n| Platform | Backend | Benefit |\n|----------|---------|---------|\n| macOS \u002F iOS | Metal | Largest gain — skips the slow SPIR-V → Metal shader conversion at first load |\n| Windows | D3D12 | Large gain — skips SPIR-V → DXIL conversion; pipeline creation still happens at runtime |\n| Android (Mobile renderer) | Vulkan | Shorter first load; no effect on the Compatibility (GLES3) renderer |\n| Linux \u002F Windows | Vulkan | Smaller improvement — Vulkan consumes SPIR-V directly |\n\n### CI Workflow Note\n\nThe Shader Baker runs automatically when exporting via the editor GUI or CLI (`--export-release`). It is controlled by the preset, not a separate CLI flag. Caveat: the editor can only bake for drivers its own OS supports — a Linux runner bakes Vulkan only, so D3D12 presets need a Windows runner and Metal presets a macOS runner.\n\n```bash\n# Shader Baker runs as part of normal export (no extra flag needed).\ngodot --headless --export-release \"Windows Desktop\" build\u002Fwindows\u002FMyGame.exe\n```\n\n---\n\n## 8. Windows Export — Native Resource Editing (Godot 4.5+)\n\nGodot 4.5+ writes `.exe` metadata (version, icon, copyright, company) natively from the preset's `application\u002F*` fields — no external `rcedit` download, so drop any CI `rcedit` step. Earlier versions need `rcedit`.\n\n> See [references\u002Fwindows-resource-editing.md](references\u002Fwindows-resource-editing.md) for the field table, icon formats and setup.\n\n---\n\n## 9. Checklist\n\n- [ ] Export templates downloaded for the target Godot version (Editor → Export Templates)\n- [ ] `export_presets.cfg` committed to version control\n- [ ] Secrets (keystore passwords, codesign passwords, API keys) stored in env vars or CI secrets, never in the file\n- [ ] Each preset has a unique `name=` that matches the CLI `--export-release` argument exactly\n- [ ] Output directories created before the export command runs (`mkdir -p`)\n- [ ] Linux binary still executable after packaging (`chmod +x` if the bit was lost)\n- [ ] `application\u002Fconfig\u002Fversion` in project.godot is populated at export time from a git tag\n- [ ] Web export: thread support left off, or the host sends `COOP` + `COEP` headers (see **web-export**)\n- [ ] Android release preset uses a signed keystore, not the debug keystore\n- [ ] macOS builds intended for distribution are codesigned and notarized\n- [ ] Artifacts are uploaded per-platform in CI so individual platform builds can be downloaded\n- [ ] itch.io channels follow the naming convention (windows, linux, macos, web, android)\n- [ ] Butler API key stored as a CI secret, not hardcoded\n- [ ] Steam depot configs are kept out of public repositories\n- [ ] Steam launch date checked against the fixed lead times (21-day fee wait, two-week Coming Soon, 7-business-day reviews)\n- [ ] Shader Baker enabled for D3D12 and Metal targets (Forward+\u002FMobile only), exported from a Windows \u002F macOS host respectively (Godot 4.5+)\n- [ ] Windows `.exe` metadata (version, icon, company name) set in the export preset — rcedit no longer required (Godot 4.5+)\n","# Export Pipeline in Godot 4.3+\n\nAll examples target Godot 4.3+ with no deprecated APIs. GDScript is shown first, C# follows where applicable.\n\n> **Related skills:** **godot-testing** for CI\u002FCD test integration, **godot-optimization** for pre-export performance checks, **responsive-ui** for platform-specific resolution settings, **mobile-development** for Android\u002FiOS export specifics, **web-export** for browser builds and hosting.\n\n---\n\n## 1. Export Presets\n\n### Creating Presets in the Editor\n\nOpen **Project → Export**, click **Add…**, and select the target platform. Each preset maps to one entry in `export_presets.cfg`. You can create multiple presets for the same platform (e.g., a debug build and a release build for Windows).\n\nRequired one-time setup per platform:\n- **Export Templates** must be downloaded via **Editor → Export Templates**.\n- Platform-specific toolchains (Android SDK, Xcode, etc.) must be installed separately.\n\n### export_presets.cfg\n\nGodot writes `export_presets.cfg` to the project root. Commit this file: options marked secret (keystore and codesign paths and passwords, the encryption key) go to `.godot\u002Fexport_credentials.cfg` instead, which must **never** be committed. In CI, supply them via env vars such as `GODOT_ANDROID_KEYSTORE_RELEASE_PASSWORD`.\n\nExample preset structure (Windows release):\n\n```ini\n[preset.0]\n\nname=\"Windows Desktop\"\nplatform=\"Windows Desktop\"\nrunnable=true\ndedicated_server=false\ncustom_features=\"\"\nexport_filter=\"all_resources\"\ninclude_filter=\"\"\nexclude_filter=\"\"\nexport_path=\"build\u002Fwindows\u002FMyGame.exe\"\nencryption_include_filters=\"\"\nencryption_exclude_filters=\"\"\nencrypt_pck=false\nencrypt_directory=false\n\n[preset.0.options]\n\ncustom_template\u002Fdebug=\"\"\ncustom_template\u002Frelease=\"\"\ndebug\u002Fexport_console_wrapper=1\nbinary_format\u002Fembed_pck=true\ntexture_format\u002Fs3tc_bptc=true\ntexture_format\u002Fetc2_astc=false\nbinary_format\u002Farchitecture=\"x86_64\"\ncodesign\u002Fenable=false\ncodesign\u002Ftimestamp=true\ncodesign\u002Ftimestamp_server_url=\"\"\ncodesign\u002Fdigest_algorithm=1\ncodesign\u002Fdescription=\"\"\ncodesign\u002Fcustom_options=PackedStringArray()\napplication\u002Ficon=\"\"\napplication\u002Fconsole_wrapper_icon=\"\"\napplication\u002Ficon_interpolation=4\napplication\u002Ffile_version=\"\"\napplication\u002Fproduct_version=\"\"\napplication\u002Fcompany_name=\"\"\napplication\u002Fproduct_name=\"\"\napplication\u002Ffile_description=\"\"\napplication\u002Fcopyright=\"\"\napplication\u002Ftrademarks=\"\"\napplication\u002Fexport_angle=0\napplication\u002Fexport_d3d12=0\napplication\u002Fd3d12_agility_sdk_multiarch=true\nssh_remote_deploy\u002Fenabled=false\nssh_remote_deploy\u002Fhost=\"user@host_ip\"\nssh_remote_deploy\u002Fport=\"22\"\nssh_remote_deploy\u002Fextra_args_ssh=\"\"\nssh_remote_deploy\u002Fextra_args_scp=\"\"\nssh_remote_deploy\u002Frun_script=\"#!\u002Fusr\u002Fbin\u002Fenv bash\\nexport DISPLAY=:0\\n\\\"{temp_dir}\u002F{exe_name}\\\" {cmd_args}\"\nssh_remote_deploy\u002Fcleanup_script=\"#!\u002Fusr\u002Fbin\u002Fenv bash\\nkill $(pgrep -x -f \\\"{temp_dir}\u002F{exe_name} {cmd_args}\\\")\\nrm -rf \\\"{temp_dir}\\\"\"\n```\n\n> The editor rewrites `export_presets.cfg` whenever a preset changes. Do not hand-edit it while the editor is open.\n\n> ⚠️ **Changed in Godot 4.7:** The \"runnable\" flag moved out of export presets — `runnable=` (shown in the example above for 4.3–4.6) is no longer a per-preset property in `export_presets.cfg`; a 4.7 editor writes a top-level `[runnable_presets]` section (platform name → preset name) in the same file, and still reads the legacy key. Don't be surprised when the line disappears from the file after saving in a 4.7 editor. See [GH-114930](https:\u002F\u002Fgithub.com\u002Fgodotengine\u002Fgodot\u002Fpull\u002F114930).\n\n> **Godot 4.7+:** Sparse PCK exports (patch packs) support encrypting the file index, complementing the existing `encrypt_pck` \u002F `encrypt_directory` preset options. ([GH-113920](https:\u002F\u002Fgithub.com\u002Fgodotengine\u002Fgodot\u002Fpull\u002F113920))\n\n---\n\n## 2. Platform-Specific Settings\n\n| Platform  | Key Setting \u002F Consideration                                                                                                                      |\n|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------|\n| **Windows** | Set `application\u002Ficon` (.ico file). Codesigning requires a `.pfx` certificate; set `codesign\u002Fenable=true` and supply `codesign\u002Fidentity` + `codesign\u002Fpassword` via env vars. Without codesigning, Windows SmartScreen will warn users. |\n| **Linux**   | No codesigning required. The binary is written executable (0755); re-run `chmod +x` if an upload or archive step drops the bit. Ship as a tarball or AppImage for distribution. |\n| **macOS**   | Requires notarization for Gatekeeper to allow launch without warning. Set `codesign\u002Fcodesign` (rcodesign, or Xcode codesign on a Mac) and `notarization\u002Fnotarization` (rcodesign or Xcode notarytool); the export submits for notarization. `Info.plist` entries are `application\u002F*` (bundle ID, version) and `privacy\u002F*` (usage descriptions). |\n| **Web**     | Compatibility renderer only, and no C#. The preset's `variant\u002Fthread_support` is off by default (Godot 4.3+), so the build runs on any static host; a threaded build needs `Cross-Origin-Opener-Policy: same-origin` and `Cross-Origin-Embedder-Policy: require-corp` headers. Exported output is a `.html` + `.js` + `.wasm` + `.pck` bundle. Details: **web-export**. |\n| **Android** | Requires a keystore for release signing. Set `keystore\u002Frelease` to the `.keystore` path and supply `keystore\u002Frelease_user` + `keystore\u002Frelease_password` via env vars. Declare permissions in the preset under `permissions\u002F*`. Set `package\u002Funique_name` to a reverse-DNS string (e.g., `com.studio.mygame`). |\n| **iOS**     | Requires a valid Apple provisioning profile (`.mobileprovision`). Set `application\u002Fbundle_identifier`, `application\u002Fcode_sign_identity_release`, and `application\u002Fprovisioning_profile_uuid_release`. Distribution builds require an App Store distribution certificate. |\n\n> **Godot 4.8+:** Windows, Linux and macOS presets gain `debug\u002Fexport_debug_symbols`, which ships a `.debugsymbols` file (`.dSYM` on macOS) beside the executable; it needs a same-named symbols file next to the export template. Android gains `gradle_build\u002Fminification` (R8, release builds).\n\n---\n\n## 3. Export from CLI\n\nRun Godot in headless mode to export without opening the GUI. This is the standard approach for CI\u002FCD.\n\n### Release Export\n\n```bash\ngodot --headless --export-release \"Windows Desktop\" build\u002Fwindows\u002FMyGame.exe\n```\n\n### Debug Export\n\n```bash\ngodot --headless --export-debug \"Windows Desktop\" build\u002Fwindows\u002FMyGame.exe\n```\n\n### Export .pck Only (no executable)\n\nUse `--export-pack` when you only want to ship updated game data alongside a fixed engine binary (e.g., DLC or patch distribution):\n\n```bash\ngodot --headless --export-pack \"Windows Desktop\" build\u002Fwindows\u002FMyGame.pck\n```\n\n> **Godot 4.7+:** When exporting patch PCKs for Android, an APK or AAB can be provided as the base pack, extending PCK-patching workflows to Android builds. ([GH-116553](https:\u002F\u002Fgithub.com\u002Fgodotengine\u002Fgodot\u002Fpull\u002F116553))\n\n### Packing In-Memory Data (Godot 4.7+)\n\n`PCKPacker.add_file_from_buffer(target_path, data, encrypt = false)` packs a `PackedByteArray` straight into a PCK — no temp file on disk — which is handy when generating patch content from a build script:\n\n```gdscript\nvar build_info: String = \"v\" + ProjectSettings.get_setting(\"application\u002Fconfig\u002Fversion\", \"dev\")\nvar packer := PCKPacker.new()\npacker.pck_start(\"user:\u002F\u002Fpatch_1.pck\")\npacker.add_file_from_buffer(\"res:\u002F\u002Fdata\u002Fbuild_info.txt\", build_info.to_utf8_buffer())\npacker.flush()\n```\n\n```csharp\nstring buildInfo = \"v\" + ProjectSettings.GetSetting(\"application\u002Fconfig\u002Fversion\", \"dev\").AsString();\nvar packer = new PckPacker();\npacker.PckStart(\"user:\u002F\u002Fpatch_1.pck\");\npacker.AddFileFromBuffer(\"res:\u002F\u002Fdata\u002Fbuild_info.txt\", buildInfo.ToUtf8Buffer());\npacker.Flush();\n```\n\n### Key CLI flags\n\n| Flag | Purpose |\n|------|---------|\n| `--headless` | No display server; required for server\u002FCI environments |\n| `--export-release \"Preset Name\" path` | Export using release template |\n| `--export-debug \"Preset Name\" path` | Export using debug template |\n| `--export-pack \"Preset Name\" path` | Export .pck resource pack only |\n| `--quit-after N` | Quit after N main-loop iterations (rarely needed for export) |\n\n> The preset name in the CLI flag must match `name=` in `export_presets.cfg` exactly, including capitalisation and spaces.\n\n---\n\n## 4. CI\u002FCD with GitHub Actions\n\nRun `godot --headless --export-release` inside a GitHub Actions matrix that builds Windows, Linux, and Web artifacts on every push and tagged release. Use [`chickensoft-games\u002Fsetup-godot@v2`](https:\u002F\u002Fgithub.com\u002Fchickensoft-games\u002Fsetup-godot) to install the engine + export templates (set `use-dotnet: true` for C# projects). Inject the version from `git describe` before export so `application\u002Fconfig\u002Fversion` is correct in the binary.\n\nSee [references\u002Fci-cd-github-actions.md](references\u002Fci-cd-github-actions.md) for the full `.github\u002Fworkflows\u002Fexport.yml` with matrix presets, artifact upload, and Linux executable bit handling.\n\n---\n\n## 5. Versioning\n\nSet the version in `application\u002Fconfig\u002Fversion` and read it at runtime with `ProjectSettings.get_setting()`. To inject a version from git at export time, run a `--script` tool (a script extending `SceneTree`) that calls `git describe --tags --always --dirty` through `OS.execute()` before the export step. Tags follow Semantic Versioning (`v1.2.3`).\n\n> See [references\u002Fversioning.md](references\u002Fversioning.md) for the runtime version label, the `inject_version.gd` tool, and the tag convention.\n\n---\n\n## 6. Distribution: itch.io and Steam\n\n**itch.io** uses the [Butler](https:\u002F\u002Fitch.io\u002Fdocs\u002Fbutler\u002F) CLI: `butler push build\u002Fwindows\u002F my-studio\u002Fmy-game:windows --userversion \"$VERSION\"`. Channel names follow a convention (`windows`, `linux`, `macos`, `web`, `android`). In CI, the [`Ayowel\u002Fbutler-to-itch@v1`](https:\u002F\u002Fgithub.com\u002FAyowel\u002Fbutler-to-itch) action pushes all artifacts at once; store the API key as the `BUTLER_API_KEY` secret.\n\n**Steam** requires three pieces: the Steamworks SDK (non-redistributable, keep out of public repos), the [GodotSteam](https:\u002F\u002Fgodotsteam.com\u002F) addon for engine bindings, and depot configurations driven by `steamcmd +run_app_build app_build.vdf`. Steam integration is outside the export pipeline itself.\n\nSee [references\u002Fdistribution-itch-steam.md](references\u002Fdistribution-itch-steam.md) for full butler install instructions, channel naming table, the `deploy-itch` GitHub Actions job, and the Steam component breakdown. For the release side — the 21-day app-fee wait, the two-week Coming Soon minimum, review times, store asset sizes, demo and Next Fest deadlines, and discount rules — see [references\u002Fsteam-release-planning.md](references\u002Fsteam-release-planning.md).\n\n---\n\n## 7. Shader Baker (Godot 4.5+)\n\nGodot 4.5 introduces the **Shader Baker**, an export-time tool that pre-compiles shaders for the target platform. It mainly shortens first-launch load time, most on Direct3D 12 and Metal where shader conversion is slow. It does not remove pipeline-compilation stutter, which still needs pipeline precompilation.\n\n### Enabling\n\nIn **Project → Export**, open a preset and locate the **Shader Baker** section. Tick **Enabled** (`shader_baker\u002Fenabled`, off by default). There is no backend picker: it bakes for the target platform's `rendering\u002Frendering_device\u002Fdriver` setting, on the Forward+ and Mobile renderers only.\n\n> The Shader Baker makes exports slightly slower and the PCK a few megabytes larger. The baked shaders are embedded in the `.pck` file.\n\n### Impact by Platform\n\n| Platform | Backend | Benefit |\n|----------|---------|---------|\n| macOS \u002F iOS | Metal | Largest gain — skips the slow SPIR-V → Metal shader conversion at first load |\n| Windows | D3D12 | Large gain — skips SPIR-V → DXIL conversion; pipeline creation still happens at runtime |\n| Android (Mobile renderer) | Vulkan | Shorter first load; no effect on the Compatibility (GLES3) renderer |\n| Linux \u002F Windows | Vulkan | Smaller improvement — Vulkan consumes SPIR-V directly |\n\n### CI Workflow Note\n\nThe Shader Baker runs automatically when exporting via the editor GUI or CLI (`--export-release`). It is controlled by the preset, not a separate CLI flag. Caveat: the editor can only bake for drivers its own OS supports — a Linux runner bakes Vulkan only, so D3D12 presets need a Windows runner and Metal presets a macOS runner.\n\n```bash\n# Shader Baker runs as part of normal export (no extra flag needed).\ngodot --headless --export-release \"Windows Desktop\" build\u002Fwindows\u002FMyGame.exe\n```\n\n---\n\n## 8. Windows Export — Native Resource Editing (Godot 4.5+)\n\nGodot 4.5+ writes `.exe` metadata (version, icon, copyright, company) natively from the preset's `application\u002F*` fields — no external `rcedit` download, so drop any CI `rcedit` step. Earlier versions need `rcedit`.\n\n> See [references\u002Fwindows-resource-editing.md](references\u002Fwindows-resource-editing.md) for the field table, icon formats and setup.\n\n---\n\n## 9. Checklist\n\n- [ ] Export templates downloaded for the target Godot version (Editor → Export Templates)\n- [ ] `export_presets.cfg` committed to version control\n- [ ] Secrets (keystore passwords, codesign passwords, API keys) stored in env vars or CI secrets, never in the file\n- [ ] Each preset has a unique `name=` that matches the CLI `--export-release` argument exactly\n- [ ] Output directories created before the export command runs (`mkdir -p`)\n- [ ] Linux binary still executable after packaging (`chmod +x` if the bit was lost)\n- [ ] `application\u002Fconfig\u002Fversion` in project.godot is populated at export time from a git tag\n- [ ] Web export: thread support left off, or the host sends `COOP` + `COEP` headers (see **web-export**)\n- [ ] Android release preset uses a signed keystore, not the debug keystore\n- [ ] macOS builds intended for distribution are codesigned and notarized\n- [ ] Artifacts are uploaded per-platform in CI so individual platform builds can be downloaded\n- [ ] itch.io channels follow the naming convention (windows, linux, macos, web, android)\n- [ ] Butler API key stored as a CI secret, not hardcoded\n- [ ] Steam depot configs are kept out of public repositories\n- [ ] Steam launch date checked against the fixed lead times (21-day fee wait, two-week Coming Soon, 7-business-day reviews)\n- [ ] Shader Baker enabled for D3D12 and Metal targets (Forward+\u002FMobile only), exported from a Windows \u002F macOS host respectively (Godot 4.5+)\n- [ ] Windows `.exe` metadata (version, icon, company name) set in the export preset — rcedit no longer required (Godot 4.5+)\n",{"name":5,"description":7},"master","60c28fdc40706a24576731e9fb3508b9c95258ad","skills\u002Fexport-pipeline",63,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter","https:\u002F\u002Fgithub.com\u002Fjame581","https:\u002F\u002Fjanmesarc.online\u002F","Software engineer. My biggest passion is game development.","2026-11-14 20:45:49",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add jame581\u002FGodotPrompter --skill export-pipeline",{"tool":60,"command":61},"bunx","bunx skills add jame581\u002FGodotPrompter --skill export-pipeline",{"tool":63,"command":64},"pnpm","pnpm dlx skills add jame581\u002FGodotPrompter --skill export-pipeline","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fexport-pipeline\u002FSKILL.md",true,[68,74,78,82,86],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Fci-cd-github-actions.md","REFERENCE","参考文档",2456,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fexport-pipeline\u002Freferences\u002Fci-cd-github-actions.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Fdistribution-itch-steam.md",3149,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fexport-pipeline\u002Freferences\u002Fdistribution-itch-steam.md",{"path":79,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002Fsteam-release-planning.md",7002,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fexport-pipeline\u002Freferences\u002Fsteam-release-planning.md",{"path":83,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Fversioning.md",2384,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fexport-pipeline\u002Freferences\u002Fversioning.md",{"path":87,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002Fwindows-resource-editing.md",1505,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fexport-pipeline\u002Freferences\u002Fwindows-resource-editing.md",[91,110,131,158,180,198],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":40},"01M6KRFE5BR2PSD08ZKDAS66R7","xr-development","Use when building VR\u002FAR\u002FXR applications — OpenXR setup, XROrigin3D, hand tracking, controllers, passthrough, and Meta Quest deployment in Godot 4.3+","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fxr-development\u002FSKILL.md",[],[98,99,39,100,38,101,102,103,104,105,106,33,107,108,109],"xr development","development","deployment","vr","setup","tracking","godot 4","ar","hand","Meta","applications","quest",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":40},"01M6KRF8GZTG1TAS506MFBSGFC","web-services","Use when a Godot game calls a web server — HTTPRequest, downloads, REST\u002FJSON APIs, auth headers, WebSocketPeer clients, TLS, retries, and keeping secrets out of the build. Not for game networking\u002FRPCs (multiplayer-basics) or browser export (web-export)","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-services\u002FSKILL.md",[],[117,118,119,120,121,122,123,124,33,39,38,125,126,127,128,129,130],"web services","web","services","tls","retries","calling","auth","downloads","clients","headers","secrets","json","build","REST",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":140,"publishedAt":40},"01M6KRF38Q4WSKAYFS56PG87T0","web-export","Use when shipping a Godot game to the browser — Web export preset options, threads vs no-threads and COOP\u002FCOEP headers, hosting on itch.io or your own server, PWA, JavaScriptBridge, user:\u002F\u002F persistence, audio and input limits, and load size","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-export\u002FSKILL.md",[137],{"categoryNo":138,"categoryName":139,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[118,26,141,142,143,144,145,146,126,147,148,39,149,150,151,152,153,154,33,155,156,157],"web export","threads","limits","shipping","size","options","hosting","input","Coop","preset","browser","game","io","load","pwa","Audio","server",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":172,"publishedAt":40},"01M6KREYFETEBH62ZTN6EZH2X3","using-godot-prompter","Bootstrap skill — establishes how to find and use GodotPrompter skills, with platform-specific tool mapping","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fusing-godot-prompter\u002FSKILL.md",[164,167],{"categoryNo":165,"categoryName":166,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":168,"categoryName":169,"taxonomyType":170,"taxonomyTypeDesc":171},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[38,173,174,34,175,33,176,31,177,178,179],"using godot prompter","find","bootstrap","tool","mapping","how","how to",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":186,"publishedAt":40},"01M6KRER5G7EQWKGAFN8QJKQ69","tween-animation","Use when implementing tweens — property animation, method tweening, chaining, parallel sequences, easing, and common UI\u002Fgameplay motion recipes","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Ftween-animation\u002FSKILL.md",[],[187,188,33,189,190,191,192,193,194,195,196,39,197],"tween animation","Animation","motion","parallel","gameplay","chaining","ui","recipes","common","implementing","sequences",{"skillNo":199,"name":200,"nameZh":6,"description":201,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":202,"categories":203,"keywords":204,"publishedAt":40},"01M6KREKGCQMVDV8WX7HWX8BZG","state-machine","Use when building a state machine or refactoring logic into one — enum, node, and resource-based FSM patterns with trade-offs. Not for adding states to an existing one","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fstate-machine\u002FSKILL.md",[],[205,206,207,38,39,208,209,210,211,212,34,33,196,213],"state","state machine","machine","patterns","node","fsm","state machines","trade","trade-offs"]