diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 1b8c58c..0eae325 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,14 +3,14 @@
"isRoot": true,
"tools": {
"powershell": {
- "version": "7.5.0",
+ "version": "7.5.1",
"commands": [
"pwsh"
],
"rollForward": false
},
"dotnet-coverage": {
- "version": "17.13.1",
+ "version": "17.14.2",
"commands": [
"dotnet-coverage"
],
@@ -24,7 +24,7 @@
"rollForward": false
},
"docfx": {
- "version": "2.78.2",
+ "version": "2.78.3",
"commands": [
"docfx"
],
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 6952a41..cd1285d 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -1,5 +1,5 @@
# Refer to https://hub.docker.com/_/microsoft-dotnet-sdk for available versions
-FROM mcr.microsoft.com/dotnet/sdk:9.0.102-noble
+FROM mcr.microsoft.com/dotnet/sdk:9.0.301-noble@sha256:4f50505b5344e9d8a76805d71bb4ba76da6b01656e17a66a8ce1e4c4dfaaec12
# Installing mono makes `dotnet test` work without errors even for net472.
# But installing it takes a long time, so it's excluded by default.
diff --git a/.github/actions/publish-artifacts/action.yaml b/.github/actions/publish-artifacts/action.yaml
index 2a75c4d..1f345fe 100644
--- a/.github/actions/publish-artifacts/action.yaml
+++ b/.github/actions/publish-artifacts/action.yaml
@@ -14,46 +14,46 @@ runs:
- name: 📢 Upload project.assets.json files
if: always()
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: projectAssetsJson-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/projectAssetsJson
continue-on-error: true
- name: 📢 Upload variables
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: variables-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/Variables
continue-on-error: true
- name: 📢 Upload build_logs
if: always()
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: build_logs-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/build_logs
continue-on-error: true
- name: 📢 Upload testResults
if: always()
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: testResults-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/testResults
continue-on-error: true
- name: 📢 Upload coverageResults
if: always()
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: coverageResults-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/coverageResults
continue-on-error: true
- name: 📢 Upload symbols
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: symbols-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/symbols
continue-on-error: true
- name: 📢 Upload deployables
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: deployables-${{ runner.os }}
path: ${{ runner.temp }}/_artifacts/deployables
diff --git a/.github/renovate.json b/.github/renovate.json
index 8ba850b..7e128ca 100644
--- a/.github/renovate.json
+++ b/.github/renovate.json
@@ -1,7 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
- "extends": ["config:recommended"],
- "semanticCommits": "disabled",
+ "extends": ["config:best-practices"],
"labels": ["dependencies"],
"packageRules": [
{
@@ -21,6 +20,10 @@
"matchDatasources": ["dotnet-version", "docker"],
"matchDepNames": ["dotnet-sdk", "mcr.microsoft.com/dotnet/sdk"],
"groupName": "Dockerfile and global.json updates"
+ },
+ {
+ "matchPackageNames": ["*"],
+ "allowedVersions": "!/-g[a-f0-9]+$/"
}
]
}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7e34d00..740f790 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -31,7 +31,7 @@ jobs:
- windows-2022
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: âš™ Install prerequisites
@@ -72,6 +72,16 @@ jobs:
continue-on-error: true
if: env.codecov_token != ''
+ docs:
+ name: 📃 Docs
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
+ - name: 🔗 Markup Link Checker (mlc)
+ uses: becheran/mlc@88c9db09b8dabab813a2edd13f955b36aa73657a # v0.22.0
+ with:
+ args: --do-not-warn-for-redirect-to https://learn.microsoft.com*,https://dotnet.microsoft.com/*,https://dev.azure.com/*,https://app.codecov.io/* -p docfx
+
ship:
if: startsWith(github.ref, 'refs/tags/v')
needs: build
diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml
new file mode 100644
index 0000000..bb149d6
--- /dev/null
+++ b/.github/workflows/copilot-setup-steps.yml
@@ -0,0 +1,41 @@
+name: "Copilot Setup Steps"
+
+# Automatically run the setup steps when they are changed to allow for easy validation, and
+# allow manual testing through the repository's "Actions" tab
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - main
+ paths:
+ - .github/workflows/copilot-setup-steps.yml
+ pull_request:
+ paths:
+ - .github/workflows/copilot-setup-steps.yml
+
+jobs:
+ # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot.
+ copilot-setup-steps:
+ runs-on: ubuntu-latest
+ # Set the permissions to the lowest permissions possible needed for your steps.
+ # Copilot will be given its own token for its operations.
+ permissions:
+ # If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete.
+ contents: read
+
+ # You can define any steps you want, and they will run before the agent starts.
+ # If you do not check out your code, Copilot will do this for you.
+ steps:
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
+ with:
+ fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
+ - name: âš™ Install prerequisites
+ run: |
+ ./init.ps1 -UpgradePrerequisites -NoNuGetCredProvider
+ dotnet --info
+
+ # Print mono version if it is present.
+ if (Get-Command mono -ErrorAction SilentlyContinue) {
+ mono --version
+ }
+ shell: pwsh
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 70b779b..0a8f821 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -25,7 +25,7 @@ jobs:
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: âš™ Install prerequisites
@@ -35,10 +35,10 @@ jobs:
name: 📚 Generate documentation
- name: Upload artifact
- uses: actions/upload-pages-artifact@v3
+ uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
with:
path: docfx/_site
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v4
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
diff --git a/.github/workflows/libtemplate-update.yml b/.github/workflows/libtemplate-update.yml
index 53df80f..7d0a67a 100644
--- a/.github/workflows/libtemplate-update.yml
+++ b/.github/workflows/libtemplate-update.yml
@@ -17,7 +17,7 @@ jobs:
contents: write
pull-requests: write
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 766ebaf..e37811d 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -65,7 +65,7 @@ jobs:
Echo "runid=$runid" >> $env:GITHUB_OUTPUT
- name: 🔻 Download deployables artifacts
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: deployables-Linux
path: ${{ runner.temp }}/deployables
@@ -74,11 +74,11 @@ jobs:
- name: 💽 Upload artifacts to release
shell: pwsh
- if: ${{ github.event.release.assets_url }} != ''
+ if: ${{ github.event_name == 'release' && github.event.release.assets_url != '' }}
env:
GH_TOKEN: ${{ github.token }}
run: |
- Get-ChildItem '${{ runner.temp }}/deployables' |% {
+ Get-ChildItem '${{ runner.temp }}/deployables' -File -Recurse |% {
Write-Host "Uploading $($_.Name) to release..."
gh release -R ${{ github.repository }} upload "${{ github.ref_name }}" $_.FullName
}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 77f5e0a..4281f29 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -25,7 +25,7 @@ You should install the version specified in `global.json` or a later version wit
the same major.minor.Bxx "hundreds" band.
For example if 2.2.300 is specified, you may install 2.2.300, 2.2.301, or 2.2.310
while the 2.2.400 version would not be considered compatible by .NET SDK.
-See [.NET Core Versioning](https://docs.microsoft.com/dotnet/core/versions/) for more information.
+See [.NET Core Versioning](https://learn.microsoft.com/dotnet/core/versions/) for more information.
## Package restore
@@ -44,7 +44,7 @@ Building, testing, and packing this repository can be done by using the standard
## Releases
Use `nbgv tag` to create a tag for a particular commit that you mean to release.
-[Learn more about `nbgv` and its `tag` and `prepare-release` commands](https://github.com/dotnet/Nerdbank.GitVersioning/blob/main/doc/nbgv-cli.md).
+[Learn more about `nbgv` and its `tag` and `prepare-release` commands](https://dotnet.github.io/Nerdbank.GitVersioning/docs/nbgv-cli.html).
Push the tag.
@@ -82,3 +82,17 @@ Configuration is in the `.github/renovate.json` file.
When changing the renovate.json file, follow [these validation steps](https://docs.renovatebot.com/config-validation/).
If Renovate is not creating pull requests when you expect it to, check that the [Renovate GitHub App](https://github.com/apps/renovate) is configured for your account or repo.
+
+## Merging latest from Library.Template
+
+### Maintaining your repo based on this template
+
+The best way to keep your repo in sync with Library.Template's evolving features and best practices is to periodically merge the template into your repo:
+`
+```ps1
+git fetch
+git checkout origin/main
+.\tools\MergeFrom-Template.ps1
+# resolve any conflicts, then commit the merge commit.
+git push origin -u HEAD
+```
diff --git a/Directory.Build.props b/Directory.Build.props
index 528c94f..a015151 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -39,6 +39,11 @@
snupkg
+
+ 13
+ 16.9
+
+
diff --git a/Directory.Build.targets b/Directory.Build.targets
index ffbdb50..b4afce0 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -1,9 +1,5 @@
-
- 13
- 16.9
-
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 298ac85..4e4f738 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -9,7 +9,7 @@
-
+
diff --git a/global.json b/global.json
index 119eff7..0e241b6 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
- "version": "9.0.102",
+ "version": "9.0.301",
"rollForward": "patch",
"allowPrerelease": false
}
diff --git a/tools/Get-3rdPartySymbolFiles.ps1 b/tools/Get-3rdPartySymbolFiles.ps1
new file mode 100644
index 0000000..ef6bbef
--- /dev/null
+++ b/tools/Get-3rdPartySymbolFiles.ps1
@@ -0,0 +1,91 @@
+Function Get-FileFromWeb([Uri]$Uri, $OutFile) {
+ $OutDir = Split-Path $OutFile
+ if (!(Test-Path $OutFile)) {
+ Write-Verbose "Downloading $Uri..."
+ if (!(Test-Path $OutDir)) { New-Item -ItemType Directory -Path $OutDir | Out-Null }
+ try {
+ (New-Object System.Net.WebClient).DownloadFile($Uri, $OutFile)
+ }
+ finally {
+ # This try/finally causes the script to abort
+ }
+ }
+}
+
+Function Unzip($Path, $OutDir) {
+ $OutDir = (New-Item -ItemType Directory -Path $OutDir -Force).FullName
+ Add-Type -AssemblyName System.IO.Compression.FileSystem
+
+ # Start by extracting to a temporary directory so that there are no file conflicts.
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($Path, "$OutDir.out")
+
+ # Now move all files from the temp directory to $OutDir, overwriting any files.
+ Get-ChildItem -Path "$OutDir.out" -Recurse -File | ForEach-Object {
+ $destinationPath = Join-Path -Path $OutDir -ChildPath $_.FullName.Substring("$OutDir.out".Length).TrimStart([io.path]::DirectorySeparatorChar, [io.path]::AltDirectorySeparatorChar)
+ if (!(Test-Path -Path (Split-Path -Path $destinationPath -Parent))) {
+ New-Item -ItemType Directory -Path (Split-Path -Path $destinationPath -Parent) | Out-Null
+ }
+ Move-Item -Path $_.FullName -Destination $destinationPath -Force
+ }
+ Remove-Item -Path "$OutDir.out" -Recurse -Force
+}
+
+Function Get-SymbolsFromPackage($id, $version) {
+ $symbolPackagesPath = "$PSScriptRoot/../obj/SymbolsPackages"
+ New-Item -ItemType Directory -Path $symbolPackagesPath -Force | Out-Null
+ $nupkgPath = Join-Path $symbolPackagesPath "$id.$version.nupkg"
+ $snupkgPath = Join-Path $symbolPackagesPath "$id.$version.snupkg"
+ $unzippedPkgPath = Join-Path $symbolPackagesPath "$id.$version"
+ Get-FileFromWeb -Uri "https://www.nuget.org/api/v2/package/$id/$version" -OutFile $nupkgPath
+ Get-FileFromWeb -Uri "https://www.nuget.org/api/v2/symbolpackage/$id/$version" -OutFile $snupkgPath
+
+ Unzip -Path $nupkgPath -OutDir $unzippedPkgPath
+ Unzip -Path $snupkgPath -OutDir $unzippedPkgPath
+
+ Get-ChildItem -Recurse -LiteralPath $unzippedPkgPath -Filter *.pdb | % {
+ # Collect the DLLs/EXEs as well.
+ $rootName = Join-Path $_.Directory $_.BaseName
+ if ($rootName.EndsWith('.ni')) {
+ $rootName = $rootName.Substring(0, $rootName.Length - 3)
+ }
+
+ $dllPath = "$rootName.dll"
+ $exePath = "$rootName.exe"
+ if (Test-Path $dllPath) {
+ $BinaryImagePath = $dllPath
+ }
+ elseif (Test-Path $exePath) {
+ $BinaryImagePath = $exePath
+ }
+ else {
+ Write-Warning "`"$_`" found with no matching binary file."
+ $BinaryImagePath = $null
+ }
+
+ if ($BinaryImagePath) {
+ Write-Output $BinaryImagePath
+ Write-Output $_.FullName
+ }
+ }
+}
+
+Function Get-PackageVersion($id) {
+ $versionProps = [xml](Get-Content -LiteralPath $PSScriptRoot\..\Directory.Packages.props)
+ $version = $versionProps.Project.ItemGroup.PackageVersion | ? { $_.Include -eq $id } | % { $_.Version }
+ if (!$version) {
+ Write-Error "No package version found in Directory.Packages.props for the package '$id'"
+ }
+
+ $version
+}
+
+# All 3rd party packages for which symbols packages are expected should be listed here.
+# These must all be sourced from nuget.org, as it is the only feed that supports symbol packages.
+$3rdPartyPackageIds = @()
+
+$3rdPartyPackageIds | % {
+ $version = Get-PackageVersion $_
+ if ($version) {
+ Get-SymbolsFromPackage -id $_ -version $version
+ }
+}
diff --git a/tools/Get-NuGetTool.ps1 b/tools/Get-NuGetTool.ps1
index 3097c87..8a3b9ee 100644
--- a/tools/Get-NuGetTool.ps1
+++ b/tools/Get-NuGetTool.ps1
@@ -6,7 +6,7 @@
#>
Param(
[Parameter()]
- [string]$NuGetVersion='6.4.0'
+ [string]$NuGetVersion='6.12.2'
)
$toolsPath = & "$PSScriptRoot\Get-TempToolsPath.ps1"
diff --git a/tools/Get-SymbolFiles.ps1 b/tools/Get-SymbolFiles.ps1
index b5063ce..70656c0 100644
--- a/tools/Get-SymbolFiles.ps1
+++ b/tools/Get-SymbolFiles.ps1
@@ -43,7 +43,7 @@ $PDBs |% {
}
} |% {
# Collect the DLLs/EXEs as well.
- $rootName = "$($_.Directory)/$($_.BaseName)"
+ $rootName = Join-Path $_.Directory $_.BaseName
if ($rootName.EndsWith('.ni')) {
$rootName = $rootName.Substring(0, $rootName.Length - 3)
}
diff --git a/tools/Install-DotNetSdk.ps1 b/tools/Install-DotNetSdk.ps1
index e08571b..402b430 100644
--- a/tools/Install-DotNetSdk.ps1
+++ b/tools/Install-DotNetSdk.ps1
@@ -36,7 +36,11 @@ if (!(Test-Path $DotNetInstallScriptRoot)) { New-Item -ItemType Directory -Path
$DotNetInstallScriptRoot = Resolve-Path $DotNetInstallScriptRoot
# Look up actual required .NET SDK version from global.json
-$sdkVersion = & "$PSScriptRoot/variables/DotNetSdkVersion.ps1"
+$sdks = @(New-Object PSObject -Property @{ Version = & "$PSScriptRoot/variables/DotNetSdkVersion.ps1" })
+
+# Sometimes a repo requires extra SDKs to be installed (e.g. msbuild.locator scenarios running in tests).
+# In such a circumstance, a precise SDK version or a channel can be added as in the example below:
+# $sdks += New-Object PSObject -Property @{ Channel = '8.0' }
If ($IncludeX86 -and ($IsMacOS -or $IsLinux)) {
Write-Verbose "Ignoring -IncludeX86 switch because 32-bit runtimes are only supported on Windows."
@@ -191,13 +195,16 @@ if ($InstallLocality -eq 'machine') {
$DotNetInstallDir = '/usr/share/dotnet'
} else {
$restartRequired = $false
- if ($PSCmdlet.ShouldProcess(".NET SDK $sdkVersion", "Install")) {
- Install-DotNet -Version $sdkVersion -Architecture $arch
- $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)
-
- if ($IncludeX86) {
- Install-DotNet -Version $sdkVersion -Architecture x86
+ $sdks |% {
+ if ($_.Version) { $version = $_.Version } else { $version = $_.Channel }
+ if ($PSCmdlet.ShouldProcess(".NET SDK $_", "Install")) {
+ Install-DotNet -Version $version -Architecture $arch
$restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)
+
+ if ($IncludeX86) {
+ Install-DotNet -Version $version -Architecture x86
+ $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)
+ }
}
}
@@ -296,29 +303,33 @@ $DotNetInstallScriptPathExpression = "& '$DotNetInstallScriptPathExpression'"
$anythingInstalled = $false
$global:LASTEXITCODE = 0
-if ($PSCmdlet.ShouldProcess(".NET SDK $sdkVersion", "Install")) {
- $anythingInstalled = $true
- Invoke-Expression -Command "$DotNetInstallScriptPathExpression -Version $sdkVersion -Architecture $arch -InstallDir $DotNetInstallDir $switches"
+$sdks |% {
+ if ($_.Version) { $parameters = '-Version', $_.Version } else { $parameters = '-Channel', $_.Channel }
- if ($LASTEXITCODE -ne 0) {
- Write-Error ".NET SDK installation failure: $LASTEXITCODE"
- exit $LASTEXITCODE
- }
-} else {
- Invoke-Expression -Command "$DotNetInstallScriptPathExpression -Version $sdkVersion -Architecture $arch -InstallDir $DotNetInstallDir $switches -DryRun"
-}
-
-if ($IncludeX86) {
- if ($PSCmdlet.ShouldProcess(".NET x86 SDK $sdkVersion", "Install")) {
+ if ($PSCmdlet.ShouldProcess(".NET SDK $_", "Install")) {
$anythingInstalled = $true
- Invoke-Expression -Command "$DotNetInstallScriptPathExpression -Version $sdkVersion -Architecture x86 -InstallDir $DotNetX86InstallDir $switches"
+ Invoke-Expression -Command "$DotNetInstallScriptPathExpression $parameters -Architecture $arch -InstallDir $DotNetInstallDir $switches"
if ($LASTEXITCODE -ne 0) {
- Write-Error ".NET x86 SDK installation failure: $LASTEXITCODE"
+ Write-Error ".NET SDK installation failure: $LASTEXITCODE"
exit $LASTEXITCODE
}
} else {
- Invoke-Expression -Command "$DotNetInstallScriptPathExpression -Version $sdkVersion -Architecture x86 -InstallDir $DotNetX86InstallDir $switches -DryRun"
+ Invoke-Expression -Command "$DotNetInstallScriptPathExpression $parameters -Architecture $arch -InstallDir $DotNetInstallDir $switches -DryRun"
+ }
+
+ if ($IncludeX86) {
+ if ($PSCmdlet.ShouldProcess(".NET x86 SDK $_", "Install")) {
+ $anythingInstalled = $true
+ Invoke-Expression -Command "$DotNetInstallScriptPathExpression $parameters -Architecture x86 -InstallDir $DotNetX86InstallDir $switches"
+
+ if ($LASTEXITCODE -ne 0) {
+ Write-Error ".NET x86 SDK installation failure: $LASTEXITCODE"
+ exit $LASTEXITCODE
+ }
+ } else {
+ Invoke-Expression -Command "$DotNetInstallScriptPathExpression $parameters -Architecture x86 -InstallDir $DotNetX86InstallDir $switches -DryRun"
+ }
}
}
diff --git a/tools/artifacts/symbols.ps1 b/tools/artifacts/symbols.ps1
index 9e2c7bd..b588267 100644
--- a/tools/artifacts/symbols.ps1
+++ b/tools/artifacts/symbols.ps1
@@ -1,7 +1,10 @@
$BinPath = [System.IO.Path]::GetFullPath("$PSScriptRoot/../../bin")
+$3rdPartyPath = [System.IO.Path]::GetFullPath("$PSScriptRoot/../../obj/SymbolsPackages")
if (!(Test-Path $BinPath)) { return }
$symbolfiles = & "$PSScriptRoot/../Get-SymbolFiles.ps1" -Path $BinPath | Get-Unique
+$3rdPartyFiles = & "$PSScriptRoot/../Get-3rdPartySymbolFiles.ps1"
@{
"$BinPath" = $SymbolFiles;
+ "$3rdPartyPath" = $3rdPartyFiles;
}