-
Notifications
You must be signed in to change notification settings - Fork 0
Build Pipeline
build.ps1 orchestrates the build: version stamping, bundled-fallback fetch, .NET publish, and optional GitHub release packaging. Run from the repo root:
powershell -ExecutionPolicy Bypass -File build.ps1Local builds produce dist/ only. Pass -Package when a zip and manifest are needed for GitHub release upload; those artifacts are written under dist/ by default. Pass -Version YYYY.M.D.N (release shape) or -Version YYYY.M.D.N-XXXX (dev shape, XXXX = 4 hex chars) to override the auto-derived stamp -- release.yml does this so the published tag, zip filename, and embedded assembly version stay in sync.
Sets git config core.hooksPath = .githooks if not already configured. Activates commit-msg, which rejects commit subjects with more than one (YYYY.M.D.N-XXXX) build-version stamp.
Format: YYYY.M.D.N-XXXX (dev) or YYYY.M.D.N (release).
-
YYYY.M.Dis today -
Nis the daily build counter (read from.local_build_state.json) -
XXXXis a fresh 4-hex UID
The numeric part (without the -XXXX suffix) goes into /p:Version= for dotnet publish, so the watchdog's FileVersionInfo can be read by the updater to determine "current version".
Hits api.github.com/repos/yt-dlp/yt-dlp/releases/latest, downloads yt-dlp.exe to _tools_staging/yt-dlp-og-fallback.exe, and writes the version tag to _tools_staging/yt-dlp-og-fallback.version.txt. Skipped if the staged copy already matches the latest tag.
The fallback is what the watchdog drops back into VRChat's Tools dir as yt-dlp-og.exe if the user's backup goes missing -- it keeps the patched yt-dlp's server-down fallback path functional.
Six projects total: WKVRCProxy.Shared (DLL referenced by all four exes) + WKVRCProxy (watchdog) + WKVRCProxy.Updater + WKVRCProxy.Uninstaller + WKVRCProxy.YtDlp (patched wrapper) + WKVRCProxy.Tests. All target net10.0.
All four shipped exes use the AOT publish profile:
-
WKVRCProxy->dist/WKVRCProxy.exe(~9 MB) -
WKVRCProxy.Updater->dist/WKVRCProxy.Updater.exe(~6 MB) -
WKVRCProxy.Uninstaller->dist/WKVRCProxy.Uninstaller.exe(~2 MB) -
WKVRCProxy.YtDlp->dist/tools/yt-dlp.exe(~3.27 MB)
<PublishAot>true</PublishAot> + <PublishTrimmed>true</PublishTrimmed> + <TrimMode>full</TrimMode> + <InvariantGlobalization>true</InvariantGlobalization>. JSON serialization goes through source-gen contexts (MeshJsonContext, MeshFallbackJsonContext, and WrapperJsonContext). Don't add reflection-based serializer, regex, or MessagePack paths; AOT builds must stay source-generated.
AOT prerequisites: Visual Studio Build Tools "Desktop development with C++" workload. The AOT publish step calls MSVC's link.exe. build.ps1 prepends the VS Installer dir (where vswhere.exe lives) to PATH so the AOT target can locate the toolchain. CI uses windows-latest which already has the workload installed; local devs need to install it once.
-
dist/tools/yt-dlp-og-fallback.exe-- bundled vanilla yt-dlp (downloaded fresh from yt-dlp/yt-dlp releases each build) -
dist/tools/yt-dlp-og-fallback.version.txt-- version tag of the bundled vanilla yt-dlp -
dist/tools/yt-dlp.exe-- the patched yt-dlp wrapper (built FROM this repo --WKVRCProxy.YtDlpwith<AssemblyName>yt-dlp</AssemblyName>so the AOT publish lands the binary asyt-dlp.exe).
Only runs when -Package is passed.
-
dist/WKVRCProxy-v<version>.zipcontaining the runnable contents ofdist/. -
dist/WKVRCProxy-v<version>.manifest.tsvwith SHA256 + size for every file inside the zip.
Local builds do not create a repo-root release/ directory. GitHub releases are the only path that needs packaging artifacts.
.github/workflows/ci.yml runs on push and PR to main:
- Single
windows-latestjob -
actions/setup-dotnet@v5with10.0.x -
dotnet restore+dotnet buildofWKVRCProxy.slnxin Release with-warnaserror
CI deliberately skips build.ps1 -- the smoke check is dotnet build. The actual release zip is produced by release.yml.
.github/workflows/release.yml runs on tag push matching v*:
-
windows-latest, fullbuild.ps1 -Version <stripped-tag> -Package - Promotes the
## Unreleasedsection inCHANGELOG.mdandwiki/Changelog.mdto the tagged version before the build. -
gh release create $tag $zip --title $tag --notes "...SHA256: <hash>..."-- release notes carry the curated changelog excerpt plus an auto-generated commit list. - Opens a
release/promote-changelog-<tag>PR with auto-merge somaineventually carries the promotion.
Tag format must match what build.ps1 accepts, with a leading v.
CHANGELOG.md (and its wiki/ mirror) are autogenerated from commit subjects on main -- don't hand-edit either under ## Unreleased, edits will be overwritten on the next push.
-
.github/workflows/changelog-append.ymlparses each commit on push as a conventional commit and appends bullets under## Unreleased.feat:-> Added,fix:-> Fixed,perf:/refactor:/revert:/chore(deps):-> Changed;!-> Breaking.docs:/build:/ci:/test:/non-depschore:are skipped. -
.github/workflows/release.ymlrenames## Unreleasedto## [vTAG] - DATEbefore the build, then opens an auto-merge PR to push the promotion back tomain. - Both workflows share a concurrency group so the appender can't race with a release-in-progress.
Overrides:
- Skip a commit: include
[skip changelog]in the subject. - Hand-edit a tagged section: edit either
CHANGELOG.mdorwiki/Changelog.mdunder the existing## [vX]heading. Closed sections are not touched by the workflow; only## Unreleasedis automated.
Implementation lives in .github/scripts/Update-Changelog.ps1. Modes: Append, Promote, Notes.
Start here
For users
Reference
For maintainers