Skip to content

Commit e2ca6a8

Browse files
committed
Merge remote-tracking branch 'origin/master' into sdsl-rewrite
# Conflicts: # sources/Directory.Packages.props
2 parents 34682f2 + 514f096 commit e2ca6a8

136 files changed

Lines changed: 2522 additions & 2287 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
*.zip filter=lfs diff=lfs merge=lfs -text
3737
*.tar.gz filter=lfs diff=lfs merge=lfs -text
3838
*.vsix filter=lfs diff=lfs merge=lfs -text
39+
*.onnx filter=lfs diff=lfs merge=lfs -text
3940

4041
# 3D formats
4142
*.max filter=lfs diff=lfs merge=lfs -text
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
name: Test Samples (Update Baselines)
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
run_id:
7+
description: "Workflow run ID to pull capture artifacts from (the daily test-samples-screenshots run whose captures should become the new baselines). Empty = latest successful run."
8+
type: string
9+
default: ''
10+
branch_name:
11+
description: "Branch name to push the baseline update to (auto-generated if empty)."
12+
type: string
13+
default: ''
14+
15+
permissions:
16+
contents: write
17+
pull-requests: write
18+
19+
jobs:
20+
Update:
21+
name: Refresh tests/Stride.Samples.Tests baselines
22+
runs-on: ubuntu-latest
23+
steps:
24+
- uses: actions/checkout@v4
25+
with:
26+
lfs: true
27+
# Need full history for the auto-generated branch name to be stable.
28+
fetch-depth: 0
29+
30+
- name: Resolve target run id
31+
id: resolve
32+
env:
33+
GH_TOKEN: ${{ github.token }}
34+
run: |
35+
if [ -n "${{ github.event.inputs.run_id }}" ]; then
36+
echo "run_id=${{ github.event.inputs.run_id }}" >> "$GITHUB_OUTPUT"
37+
else
38+
# Latest successful run of the daily capture workflow.
39+
run_id=$(gh run list \
40+
--workflow=test-samples-screenshots.yml \
41+
--status=success \
42+
--limit=1 \
43+
--json databaseId \
44+
--jq '.[0].databaseId')
45+
if [ -z "$run_id" ]; then
46+
echo "No successful test-samples-screenshots run found." >&2
47+
exit 1
48+
fi
49+
echo "run_id=$run_id" >> "$GITHUB_OUTPUT"
50+
fi
51+
52+
- name: Download D3D11 capture artifact from run ${{ steps.resolve.outputs.run_id }}
53+
# Baselines are sourced from D3D11 only — that's the gating matrix entry. D3D12/Vulkan
54+
# are best-effort; their captures should not become the baseline reference.
55+
env:
56+
GH_TOKEN: ${{ github.token }}
57+
run: |
58+
mkdir -p captures
59+
gh run download ${{ steps.resolve.outputs.run_id }} \
60+
--name screenshots-Direct3D11 \
61+
--dir ./captures
62+
# Layout: captures/screenshot-out/<sample>/screenshots/<frame>.png
63+
find captures -maxdepth 4 -type d | head -40
64+
65+
- name: Refresh tests/Stride.Samples.Tests/<Sample>/<frame>.png from captures
66+
run: |
67+
set -e
68+
changed=0
69+
for sample_dir in captures/screenshot-out/*/; do
70+
sample=$(basename "$sample_dir")
71+
src="$sample_dir/screenshots"
72+
[ -d "$src" ] || continue
73+
dest="tests/Stride.Samples.Tests/$sample"
74+
mkdir -p "$dest"
75+
for png in "$src"/*.png; do
76+
[ -f "$png" ] || continue
77+
cp "$png" "$dest/"
78+
changed=$((changed + 1))
79+
done
80+
done
81+
echo "Replaced $changed baseline PNG(s)."
82+
83+
- name: Open PR with refreshed baselines
84+
uses: peter-evans/create-pull-request@v7
85+
with:
86+
commit-message: "tests/Stride.Samples.Tests: refresh screenshot baselines from run ${{ steps.resolve.outputs.run_id }}"
87+
title: "Refresh sample screenshot baselines (run ${{ steps.resolve.outputs.run_id }})"
88+
body: |
89+
Automated baseline refresh from the captures of `test-samples-screenshots.yml`
90+
run [#${{ steps.resolve.outputs.run_id }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ steps.resolve.outputs.run_id }}).
91+
92+
Diff this PR against the previous baselines visually before merging — every PNG
93+
replacement here becomes the new "approved" reference for daily comparison.
94+
branch: ${{ github.event.inputs.branch_name || format('baselines/refresh-{0}', steps.resolve.outputs.run_id) }}
95+
delete-branch: true
96+
add-paths: tests/Stride.Samples.Tests/**/*.png
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
name: Test Samples (Screenshots)
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
build-type:
7+
description: Build
8+
default: Debug
9+
type: choice
10+
options:
11+
- Debug
12+
- Release
13+
schedule:
14+
# Daily at 04:00 UTC.
15+
- cron: '0 4 * * *'
16+
17+
concurrency:
18+
group: test-samples-screenshots-${{ github.ref }}
19+
cancel-in-progress: true
20+
21+
jobs:
22+
Run:
23+
name: Capture & compare all samples (${{ matrix.graphics-api }}, ${{ github.event.inputs.build-type || 'Debug' }})
24+
# Single job per graphics API: the harness + orchestrator + comparator are sample-agnostic, so a
25+
# matrix-per-sample would build the engine 15× for the same artifacts. Sequential capture
26+
# via xunit's DisableParallelization keeps total compute low (~1× engine build + ~5 min of
27+
# actual sample runs) at comparable wall-clock to a 15-parallel matrix. Per-API parallelism
28+
# is unavoidable (each API needs its own engine build).
29+
strategy:
30+
fail-fast: false
31+
matrix:
32+
graphics-api: [Direct3D11, Direct3D12, Vulkan]
33+
runs-on: windows-2025-vs2026
34+
# TODO: drop continue-on-error once D3D12 and Vulkan captures are stable.
35+
continue-on-error: ${{ matrix.graphics-api != 'Direct3D11' }}
36+
env:
37+
# Software rendering is the default in the autotesting harness; set STRIDE_TESTS_GPU=1 to opt into the GPU.
38+
STRIDE_TESTS_RENDERDOC: "error"
39+
DOTNET_DbgEnableMiniDump: "1"
40+
DOTNET_DbgMiniDumpType: "1"
41+
DOTNET_DbgMiniDumpName: "${{ github.workspace }}\\crash-dumps\\dotnet_%p.dmp"
42+
steps:
43+
- uses: actions/checkout@v4
44+
with:
45+
lfs: true
46+
submodules: true
47+
48+
- uses: actions/setup-dotnet@v4
49+
with:
50+
dotnet-version: '10.0.x'
51+
52+
- name: Configure crash dumps
53+
shell: pwsh
54+
run: |
55+
reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting" /v DontShowUI /t REG_DWORD /d 1 /f
56+
$dumpDir = "${{ github.workspace }}\crash-dumps"
57+
New-Item -Path $dumpDir -ItemType Directory -Force | Out-Null
58+
reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d $dumpDir /f
59+
reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 1 /f
60+
reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
61+
62+
# nuget.config declares `bin/packages` as the `stride-local` source. NuGet validates every
63+
# source path at restore time; on a fresh CI checkout that dir doesn't exist yet (it gets
64+
# populated by Stride's auto-pack-deploy on first build), so we materialize it as empty.
65+
- name: Pre-create bin/packages so restore doesn't fail on missing local source
66+
shell: pwsh
67+
run: New-Item -ItemType Directory -Path bin/packages -Force | Out-Null
68+
69+
# PackageStore at test runtime calls Settings.LoadDefaultSettings(null) which only loads
70+
# user + machine configs, NOT the workspace's nuget.config (no walkup with null root).
71+
# Locally this works because the dev's user config has Stride.AutoPackDeploy's
72+
# %LocalAppData%\Stride\NugetDev as a source. CI's runneradmin user has no such config,
73+
# so add bin/packages explicitly to the user config. --configfile forces the write to
74+
# the user config rather than walking up to the workspace's nuget.config (which would
75+
# conflict with the existing 'stride-local' source declared there).
76+
- name: Register bin/packages with user NuGet config
77+
shell: pwsh
78+
run: |
79+
New-Item -Path "$env:APPDATA\NuGet" -ItemType Directory -Force | Out-Null
80+
dotnet nuget add source "${{ github.workspace }}\bin\packages" --name stride-local --configfile "$env:APPDATA\NuGet\NuGet.Config"
81+
82+
# Stride.Games.AutoTesting must be built explicitly so its auto-pack-deploy lands the .nupkg
83+
# in bin/packages — the sample projects consume it via <PackageReference>, not via the
84+
# ProjectReference graph the test project would otherwise transitively pull. The engine
85+
# is built with StrideGraphicsApis pinned to the matrix entry so the resulting nupkg only
86+
# contains binaries for that API; the regenerated samples then link against those.
87+
- name: Build harness assembly (packs Stride.Games.AutoTesting into bin/packages)
88+
run: |
89+
dotnet build sources\engine\Stride.Games.AutoTesting\Stride.Games.AutoTesting.csproj `
90+
-p:StrideNativeBuildMode=Clang `
91+
-nr:false -v:m -p:WarningLevel=0 `
92+
-p:Configuration=${{ github.event.inputs.build-type || 'Debug' }} `
93+
-p:StrideGraphicsApi=${{ matrix.graphics-api }} `
94+
-p:StrideGraphicsApis=${{ matrix.graphics-api }}
95+
96+
# Install Stride.Dependencies.Lavapipe and register its ICD with the Vulkan loader
97+
# so the samples' Vulkan path resolves a software driver on the CI runner (no GPU).
98+
# On Windows the loader reads HKLM\SOFTWARE\Khronos\Vulkan\Drivers — VK_DRIVER_FILES
99+
# env var alone isn't reliable across runner Vulkan SDK versions. Mirrors the
100+
# SwiftShader registration in test-windows-game.yml.
101+
- name: Install Lavapipe and register its Vulkan ICD (Vulkan only)
102+
if: matrix.graphics-api == 'Vulkan'
103+
shell: pwsh
104+
run: |
105+
$tmpDir = "${{ runner.temp }}\lavapipe-fetch"
106+
New-Item -ItemType Directory -Path $tmpDir -Force | Out-Null
107+
Set-Content -Path "$tmpDir\LavapipeFetch.csproj" -Value '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net10.0</TargetFramework></PropertyGroup></Project>'
108+
dotnet add "$tmpDir\LavapipeFetch.csproj" package Stride.Dependencies.Lavapipe
109+
$icd = Get-ChildItem -Recurse -Path "$env:USERPROFILE\.nuget\packages\stride.dependencies.lavapipe" -Filter "lvp_icd*.json" -ErrorAction SilentlyContinue | Where-Object { $_.DirectoryName -match 'win-x64' } | Select-Object -First 1
110+
if (-not $icd) { throw "Lavapipe ICD not found in NuGet cache after restore." }
111+
New-Item -Path "HKLM:\SOFTWARE\Khronos\Vulkan\Drivers" -Force | Out-Null
112+
New-ItemProperty -Path "HKLM:\SOFTWARE\Khronos\Vulkan\Drivers" -Name $icd.FullName -Value 0 -PropertyType DWord -Force | Out-Null
113+
Write-Host "Registered Lavapipe ICD: $($icd.FullName)"
114+
115+
# Builds the test project plus its transitive ProjectReferences. StrideGraphicsApi (singular)
116+
# selects the test SDK output path; StrideGraphicsApis (plural) keeps the engine deps aligned
117+
# with the harness build above.
118+
- name: Build test project
119+
run: |
120+
dotnet build samples\Tests\Stride.Samples.Tests.csproj `
121+
-p:StrideNativeBuildMode=Clang `
122+
-nr:false -v:m -p:WarningLevel=0 `
123+
-p:Configuration=${{ github.event.inputs.build-type || 'Debug' }} `
124+
-p:StrideGraphicsApi=${{ matrix.graphics-api }} `
125+
-p:StrideGraphicsApis=${{ matrix.graphics-api }}
126+
127+
- name: Run sample screenshot tests
128+
env:
129+
# Comparator opts a few non-deterministic tests (ParticlesSample, SpriteStudioDemo,
130+
# AnimatedModel) into a Claude vision second-opinion when LPIPS is over threshold.
131+
# Key is bound to a budget-capped Anthropic workspace; the fallback only runs on
132+
# frames that already failed LPIPS so cost is bounded even when noisy.
133+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
134+
run: |
135+
dotnet test samples\Tests\Stride.Samples.Tests.csproj `
136+
--no-build `
137+
--filter "FullyQualifiedName~Stride.Samples.Tests.SampleScreenshotTests" `
138+
--logger "trx;LogFileName=screenshots.trx" `
139+
--results-directory TestResults `
140+
-p:Configuration=${{ github.event.inputs.build-type || 'Debug' }} `
141+
-p:StrideGraphicsApi=${{ matrix.graphics-api }}
142+
143+
- name: Publish test report
144+
if: always()
145+
uses: phoenix-actions/test-reporting@v15
146+
with:
147+
name: 'Sample screenshot regression (${{ matrix.graphics-api }})'
148+
path: TestResults/*.trx
149+
reporter: dotnet-trx
150+
output-to: step-summary
151+
list-tests: 'failed'
152+
153+
- name: Upload test artifacts (captures + done.json + TRX)
154+
if: always()
155+
uses: actions/upload-artifact@v4
156+
with:
157+
name: screenshots-${{ matrix.graphics-api }}
158+
path: |
159+
screenshot-out/
160+
TestResults/
161+
if-no-files-found: warn
162+
163+
- name: Upload crash dumps
164+
if: always()
165+
uses: actions/upload-artifact@v4
166+
with:
167+
name: crash-dumps-${{ matrix.graphics-api }}
168+
path: crash-dumps/
169+
if-no-files-found: ignore

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ x64Release
9797
*.opendb
9898
screenshots
9999
samplesGenerated
100+
screenshot-regression-out
101+
screenshot-out
102+
# Auto-generated by samples/Directory.Build.targets when -p:StrideAutoTesting=true is passed
103+
# (force-loads Stride.Games.AutoTesting at startup so its [ModuleInitializer] runs).
104+
_AutoTestingBootstrap.g.cs
100105

101106
# VS Code files
102107
.vscode/*

build/Stride.sln

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Graphics.Tests.10_0.
213213
EndProject
214214
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Graphics.Tests.11_0.Windows", "..\sources\engine\Stride.Graphics.Tests.11_0\Stride.Graphics.Tests.11_0.Windows.csproj", "{7CA99C7B-E3A2-4DE6-9D6C-314AE39BBBB7}"
215215
EndProject
216-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.SamplesTestServer", "..\sources\tools\Stride.SamplesTestServer\Stride.SamplesTestServer.csproj", "{75D71310-ECF7-4592-9E35-3FE540040982}"
217-
EndProject
218216
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Particles", "..\sources\engine\Stride.Particles\Stride.Particles.csproj", "{F32FDA80-B6DD-47A8-8681-437E2C0D3F31}"
219217
EndProject
220-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Games.Testing", "..\sources\engine\Stride.Games.Testing\Stride.Games.Testing.csproj", "{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}"
221-
EndProject
222218
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Native", "..\sources\engine\Stride.Native\Stride.Native.csproj", "{1DBBC150-F085-43EF-B41D-27C72D133770}"
223219
EndProject
224220
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Assets.Tests2", "..\sources\engine\Stride.Assets.Tests2\Stride.Assets.Tests2.csproj", "{370ADF53-DFFA-461E-B72A-1302C0A0DE00}"
@@ -943,18 +939,6 @@ Global
943939
{7CA99C7B-E3A2-4DE6-9D6C-314AE39BBBB7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
944940
{7CA99C7B-E3A2-4DE6-9D6C-314AE39BBBB7}.Release|Win32.ActiveCfg = Release|Any CPU
945941
{7CA99C7B-E3A2-4DE6-9D6C-314AE39BBBB7}.Release|Win32.Build.0 = Release|Any CPU
946-
{75D71310-ECF7-4592-9E35-3FE540040982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
947-
{75D71310-ECF7-4592-9E35-3FE540040982}.Debug|Any CPU.Build.0 = Debug|Any CPU
948-
{75D71310-ECF7-4592-9E35-3FE540040982}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
949-
{75D71310-ECF7-4592-9E35-3FE540040982}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
950-
{75D71310-ECF7-4592-9E35-3FE540040982}.Debug|Win32.ActiveCfg = Debug|Any CPU
951-
{75D71310-ECF7-4592-9E35-3FE540040982}.Debug|Win32.Build.0 = Debug|Any CPU
952-
{75D71310-ECF7-4592-9E35-3FE540040982}.Release|Any CPU.ActiveCfg = Release|Any CPU
953-
{75D71310-ECF7-4592-9E35-3FE540040982}.Release|Any CPU.Build.0 = Release|Any CPU
954-
{75D71310-ECF7-4592-9E35-3FE540040982}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
955-
{75D71310-ECF7-4592-9E35-3FE540040982}.Release|Mixed Platforms.Build.0 = Release|Any CPU
956-
{75D71310-ECF7-4592-9E35-3FE540040982}.Release|Win32.ActiveCfg = Release|Any CPU
957-
{75D71310-ECF7-4592-9E35-3FE540040982}.Release|Win32.Build.0 = Release|Any CPU
958942
{F32FDA80-B6DD-47A8-8681-437E2C0D3F31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
959943
{F32FDA80-B6DD-47A8-8681-437E2C0D3F31}.Debug|Any CPU.Build.0 = Debug|Any CPU
960944
{F32FDA80-B6DD-47A8-8681-437E2C0D3F31}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -967,18 +951,6 @@ Global
967951
{F32FDA80-B6DD-47A8-8681-437E2C0D3F31}.Release|Mixed Platforms.Build.0 = Release|Any CPU
968952
{F32FDA80-B6DD-47A8-8681-437E2C0D3F31}.Release|Win32.ActiveCfg = Release|Any CPU
969953
{F32FDA80-B6DD-47A8-8681-437E2C0D3F31}.Release|Win32.Build.0 = Release|Any CPU
970-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
971-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
972-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
973-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
974-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Debug|Win32.ActiveCfg = Debug|Any CPU
975-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Debug|Win32.Build.0 = Debug|Any CPU
976-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
977-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Release|Any CPU.Build.0 = Release|Any CPU
978-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
979-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
980-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Release|Win32.ActiveCfg = Release|Any CPU
981-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9}.Release|Win32.Build.0 = Release|Any CPU
982954
{1DBBC150-F085-43EF-B41D-27C72D133770}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
983955
{1DBBC150-F085-43EF-B41D-27C72D133770}.Debug|Any CPU.Build.0 = Debug|Any CPU
984956
{1DBBC150-F085-43EF-B41D-27C72D133770}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1640,9 +1612,7 @@ Global
16401612
{9DE0AA56-0DE7-4ADC-BAAC-CD38B7139EBC} = {A7ED9F01-7D78-4381-90A6-D50E51C17250}
16411613
{570B0FF9-246F-4C6C-8384-F6BE1887A4A9} = {A7ED9F01-7D78-4381-90A6-D50E51C17250}
16421614
{7CA99C7B-E3A2-4DE6-9D6C-314AE39BBBB7} = {A7ED9F01-7D78-4381-90A6-D50E51C17250}
1643-
{75D71310-ECF7-4592-9E35-3FE540040982} = {1AE1AC60-5D2F-4CA7-AE20-888F44551185}
16441615
{F32FDA80-B6DD-47A8-8681-437E2C0D3F31} = {4C142567-C42B-40F5-B092-798882190209}
1645-
{B84ECB15-5E3F-4BD1-AB87-333BAE9B70F9} = {A7ED9F01-7D78-4381-90A6-D50E51C17250}
16461616
{1DBBC150-F085-43EF-B41D-27C72D133770} = {4C142567-C42B-40F5-B092-798882190209}
16471617
{370ADF53-DFFA-461E-B72A-1302C0A0DE00} = {A47B451D-3162-410F-BAF7-C650C4B7A4B0}
16481618
{33CC6216-3F30-4B5A-BB29-C5B47EFFA713} = {A7ED9F01-7D78-4381-90A6-D50E51C17250}

nuget.config

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@
22
<configuration>
33
<packageSources>
44
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
5-
<!-- Uncomment if switching back to Sdk="Stride.Build.Sdk" project style (see build/docs/SDK-GUIDE.md). -->
6-
<!-- <add key="stride-sdks" value="build/packages" /> -->
5+
<!-- Auto-pack output. Stride.* dev versions shadow public ones during restore. -->
6+
<add key="stride-local" value="bin/packages" />
77
</packageSources>
88
<packageSourceMapping>
99
<packageSource key="nuget.org">
1010
<package pattern="*" />
11+
<!-- 3rd-party packages with a Stride prefix still resolve from nuget.org via longer-pattern wins. -->
12+
<package pattern="Stride.GNU.*" />
13+
<package pattern="Stride.Mono.*" />
14+
<package pattern="Stride.Dependencies.*" />
15+
<package pattern="Stride.GraphX.*" />
16+
<package pattern="Stride.Metrics" />
17+
<package pattern="Stride.QuickGraph" />
18+
</packageSource>
19+
<packageSource key="stride-local">
20+
<package pattern="Stride" />
21+
<package pattern="Stride.*" />
1122
</packageSource>
12-
<!-- Uncomment if switching back to Sdk="Stride.Build.Sdk" project style (see build/docs/SDK-GUIDE.md). -->
13-
<!-- <packageSource key="stride-sdks">
14-
<package pattern="Stride.Build.Sdk*" />
15-
</packageSource> -->
1623
</packageSourceMapping>
1724
</configuration>

0 commit comments

Comments
 (0)