From a44795a9b5beb2379897a39ed94f1fa509b2360f Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 2 Dec 2024 15:34:43 +1000 Subject: [PATCH 1/4] Use Actions build, .NET 9 SDK --- .github/workflows/ci.yml | 41 +++++++++ Build.ps1 | 88 ++++++++++++++----- Directory.Build.props | 17 ++++ Directory.Version.props | 5 ++ appveyor.yml | 30 ------- global.json | 3 +- sample/BlazorWasm/BlazorWasm.csproj | 10 +-- sample/Sample/Sample.csproj | 8 +- serilog-sinks-seq.sln | 11 ++- .../Properties/AssemblyInfo.cs | 8 -- .../Serilog.Sinks.Seq.csproj | 15 ++-- .../Properties/launchSettings.json | 11 --- .../Serilog.Sinks.Seq.Tests.csproj | 8 +- 13 files changed, 157 insertions(+), 98 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 Directory.Build.props create mode 100644 Directory.Version.props delete mode 100644 appveyor.yml delete mode 100644 src/Serilog.Sinks.Seq/Properties/AssemblyInfo.cs delete mode 100644 test/Serilog.Sinks.Seq.Tests/Properties/launchSettings.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..acd3bc6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,41 @@ +# If this file is renamed, the incrementing run attempt number will be reset. + +name: CI + +on: + push: + branches: [ "dev", "main" ] + pull_request: + branches: [ "dev", "main" ] + +env: + CI_BUILD_NUMBER_BASE: ${{ github.run_number }} + CI_TARGET_BRANCH: ${{ github.head_ref || github.ref_name }} + +jobs: + build: + + # The build must run on Windows so that .NET Framework targets can be built and tested. + runs-on: windows-latest + + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + - name: Setup + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + - name: Compute build number + shell: bash + run: | + echo "CI_BUILD_NUMBER=$(($CI_BUILD_NUMBER_BASE+2300))" >> $GITHUB_ENV + - name: Build and Publish + env: + DOTNET_CLI_TELEMETRY_OPTOUT: true + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: pwsh + run: | + ./Build.ps1 diff --git a/Build.ps1 b/Build.ps1 index ad15234..e798284 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -1,33 +1,79 @@ +Write-Output "build: Tool versions follow" + +dotnet --version +dotnet --list-sdks + +Write-Output "build: Build started" + Push-Location $PSScriptRoot +try { + if(Test-Path .\artifacts) { + Write-Output "build: Cleaning ./artifacts" + Remove-Item ./artifacts -Force -Recurse + } -if(Test-Path .\artifacts) { Remove-Item .\artifacts -Force -Recurse } + & dotnet restore --no-cache -& dotnet restore --no-cache + $dbp = [Xml] (Get-Content .\Directory.Version.props) + $versionPrefix = $dbp.Project.PropertyGroup.VersionPrefix -$branch = @{ $true = $env:APPVEYOR_REPO_BRANCH; $false = $(git symbolic-ref --short -q HEAD) }[$env:APPVEYOR_REPO_BRANCH -ne $NULL]; -$revision = @{ $true = "{0:00000}" -f [convert]::ToInt32("0" + $env:APPVEYOR_BUILD_NUMBER, 10); $false = "local" }[$env:APPVEYOR_BUILD_NUMBER -ne $NULL]; -$suffix = @{ $true = ""; $false = "$branch-$revision"}[$branch -eq "main" -and $revision -ne "local"] + Write-Output "build: Package version prefix is $versionPrefix" -foreach ($src in gci src/Serilog.*) { - Push-Location $src + $branch = @{ $true = $env:CI_TARGET_BRANCH; $false = $(git symbolic-ref --short -q HEAD) }[$NULL -ne $env:CI_TARGET_BRANCH]; + $revision = @{ $true = "{0:00000}" -f [convert]::ToInt32("0" + $env:CI_BUILD_NUMBER, 10); $false = "local" }[$NULL -ne $env:CI_BUILD_NUMBER]; + $suffix = @{ $true = ""; $false = "$($branch.Substring(0, [math]::Min(10,$branch.Length)) -replace '([^a-zA-Z0-9\-]*)', '')-$revision"}[$branch -eq "main" -and $revision -ne "local"] + $commitHash = $(git rev-parse --short HEAD) + $buildSuffix = @{ $true = "$($suffix)-$($commitHash)"; $false = "$($branch)-$($commitHash)" }[$suffix -ne ""] - if ($suffix) { - & dotnet pack -c Release -o ..\..\.\artifacts --version-suffix=$suffix --include-source - } else { - & dotnet pack -c Release -o ..\..\.\artifacts --include-source - } - if($LASTEXITCODE -ne 0) { exit 1 } + Write-Output "build: Package version suffix is $suffix" + Write-Output "build: Build version suffix is $buildSuffix" - Pop-Location -} + & dotnet build -c Release --version-suffix=$buildSuffix /p:ContinuousIntegrationBuild=true + if($LASTEXITCODE -ne 0) { throw "Build failed" } + + foreach ($src in Get-ChildItem src/*) { + Push-Location $src + + Write-Output "build: Packaging project in $src" + + if ($suffix) { + & dotnet pack -c Release --no-build --no-restore -o ../../artifacts --version-suffix=$suffix + } else { + & dotnet pack -c Release --no-build --no-restore -o ../../artifacts + } + if($LASTEXITCODE -ne 0) { throw "Packaging failed" } -foreach ($test in gci test/Serilog.*.Tests) { - Push-Location $test + Pop-Location + } - & dotnet test -c Release - if($LASTEXITCODE -ne 0) { exit 2 } + foreach ($test in Get-ChildItem test/*.Tests) { + Push-Location $test + Write-Output "build: Testing project in $test" + + & dotnet test -c Release --no-build --no-restore + if($LASTEXITCODE -ne 0) { throw "Testing failed" } + + Pop-Location + } + + if ($env:NUGET_API_KEY) { + # GitHub Actions will only supply this to branch builds and not PRs. We publish + # builds from any branch this action targets (i.e. main and dev). + + Write-Output "build: Publishing NuGet packages" + + foreach ($nupkg in Get-ChildItem artifacts/*.nupkg) { + & dotnet nuget push -k $env:NUGET_API_KEY -s https://api.nuget.org/v3/index.json "$nupkg" + if($LASTEXITCODE -ne 0) { throw "Publishing failed" } + } + + if (!($suffix)) { + Write-Output "build: Creating release for version $versionPrefix" + + iex "gh release create v$versionPrefix --title v$versionPrefix --generate-notes $(get-item ./artifacts/*.nupkg) $(get-item ./artifacts/*.snupkg)" + } + } +} finally { Pop-Location } - -Pop-Location diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..9f79390 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,17 @@ + + + + latest + True + true + $(MSBuildThisFileDirectory)assets/Serilog.snk + false + enable + enable + true + true + true + true + snupkg + + diff --git a/Directory.Version.props b/Directory.Version.props new file mode 100644 index 0000000..7e15d99 --- /dev/null +++ b/Directory.Version.props @@ -0,0 +1,5 @@ + + + 9.0.0 + + diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 5480b13..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,30 +0,0 @@ -version: '{build}' -skip_tags: true -image: Visual Studio 2022 -install: -- ps: mkdir -Force ".\build\" | Out-Null -- ps: $RequiredDotnetVersion = $(Get-Content ./global.json | ConvertFrom-Json).sdk.version -- ps: $env:DOTNET_INSTALL_DIR = "$pwd\.dotnetsdk" -- ps: mkdir $env:DOTNET_INSTALL_DIR -Force | Out-Null -- ps: Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile "$($env:DOTNET_INSTALL_DIR)/dotnet-install.ps1" -- ps: '& "$($env:DOTNET_INSTALL_DIR)/dotnet-install.ps1" -Version $RequiredDotnetVersion -InstallDir $env:DOTNET_INSTALL_DIR' -- ps: $env:Path = "$env:DOTNET_INSTALL_DIR;$env:Path" -build_script: -- pwsh: ./Build.ps1 -test: off -artifacts: -- path: artifacts/Serilog.*.nupkg -deploy: -- provider: NuGet - api_key: - secure: 50FmAHNDUONde6WmXHMoPBZ3uW82emXRQsr9zYNotYctEMFN+k15Y830yj/cgggk - skip_symbols: true - on: - branch: /^(main|dev)$/ -- provider: GitHub - auth_token: - secure: hX+cZmW+9BCXy7vyH8myWsYdtQHyzzil9K5yvjJv7dK9XmyrGYYDj/DPzMqsXSjo - artifact: /Serilog.*\.nupkg/ - tag: v$(appveyor_build_version) - on: - branch: main diff --git a/global.json b/global.json index be44e52..db8627a 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,7 @@ { "sdk": { - "version": "8.0.201", + "version": "9.0.100", + "allowPrerelease": false, "rollForward": "latestFeature" } } diff --git a/sample/BlazorWasm/BlazorWasm.csproj b/sample/BlazorWasm/BlazorWasm.csproj index d0fde33..3511dab 100644 --- a/sample/BlazorWasm/BlazorWasm.csproj +++ b/sample/BlazorWasm/BlazorWasm.csproj @@ -1,14 +1,14 @@ - net8.0 - enable - enable + net9.0 + false + false - - + + diff --git a/sample/Sample/Sample.csproj b/sample/Sample/Sample.csproj index 6257240..e95230a 100644 --- a/sample/Sample/Sample.csproj +++ b/sample/Sample/Sample.csproj @@ -1,15 +1,13 @@  - net8.0 + net9.0 Exe - latest - enable - false + false - + diff --git a/serilog-sinks-seq.sln b/serilog-sinks-seq.sln index 43454b2..d1ae675 100644 --- a/serilog-sinks-seq.sln +++ b/serilog-sinks-seq.sln @@ -23,7 +23,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serilog.Sinks.Seq.Tests", " EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sln", "sln", "{27A8DEB5-B04B-4DCB-8CF2-0049E5EE66AF}" ProjectSection(SolutionItems) = preProject - appveyor.yml = appveyor.yml Build.ps1 = Build.ps1 README.md = README.md .gitattributes = .gitattributes @@ -31,10 +30,19 @@ ProjectSection(SolutionItems) = preProject CHANGES.md = CHANGES.md global.json = global.json LICENSE = LICENSE + Directory.Build.props = Directory.Build.props + Directory.Version.props = Directory.Version.props EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorWasm", "sample\BlazorWasm\BlazorWasm.csproj", "{1BB4C500-449C-42DF-849D-F0CAEC9965EE}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{02D526DA-1D26-4B37-BC72-54B42CC4C185}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{8FE857C7-CD70-4FC2-98D6-022580B70659}" + ProjectSection(SolutionItems) = preProject + .github\workflows\ci.yml = .github\workflows\ci.yml + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -66,5 +74,6 @@ Global {17497155-5D94-45DF-81D9-BD960E8CF217} = {88A3ECD1-D91A-49A2-A6D7-5A70973A0E3F} {3C2D8E01-5580-426A-BDD9-EC59CD98E618} = {67B1C971-75EE-4ABE-B184-66AAC8D9D572} {1BB4C500-449C-42DF-849D-F0CAEC9965EE} = {88A3ECD1-D91A-49A2-A6D7-5A70973A0E3F} + {8FE857C7-CD70-4FC2-98D6-022580B70659} = {02D526DA-1D26-4B37-BC72-54B42CC4C185} EndGlobalSection EndGlobal diff --git a/src/Serilog.Sinks.Seq/Properties/AssemblyInfo.cs b/src/Serilog.Sinks.Seq/Properties/AssemblyInfo.cs deleted file mode 100644 index 22185ce..0000000 --- a/src/Serilog.Sinks.Seq/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("Serilog.Sinks.Seq.Tests, PublicKey=" + - "0024000004800000940000000602000000240000525341310004000001000100fb8d13fd344a1c" + - "6fe0fe83ef33c1080bf30690765bc6eb0df26ebfdf8f21670c64265b30db09f73a0dea5b3db4c9" + - "d18dbf6d5a25af5ce9016f281014d79dc3b4201ac646c451830fc7e61a2dfd633d34c39f87b818" + - "94191652df5ac63cc40c77f3542f702bda692e6e8a9158353df189007a49da0f3cfd55eb250066" + - "b19485ec")] diff --git a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj index 6ffec04..3d0abc6 100644 --- a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj +++ b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj @@ -2,25 +2,16 @@ A Serilog sink that writes events to Seq using newline-delimited JSON and HTTP/HTTPS. - 9.0.0 Serilog Contributors;Serilog.Sinks.Seq Contributors;Datalust Pty Ltd Copyright © Serilog Contributors, Serilog.Sinks.Seq Contributors, Datalust Pty Ltd. netstandard2.0;net6.0 - true - true Serilog - ../../assets/Serilog.snk - true - true serilog;seq icon.png https://github.com/serilog/serilog-sinks-seq Apache-2.0 https://github.com/datalust/serilog-sinks-seq git - true - 12 - enable README.md @@ -29,7 +20,11 @@ - + + + + + diff --git a/test/Serilog.Sinks.Seq.Tests/Properties/launchSettings.json b/test/Serilog.Sinks.Seq.Tests/Properties/launchSettings.json deleted file mode 100644 index 3ab0635..0000000 --- a/test/Serilog.Sinks.Seq.Tests/Properties/launchSettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "profiles": { - "test": { - "commandName": "test" - }, - "test-dnxcore50": { - "commandName": "test", - "sdkVersion": "dnx-coreclr-win-x86.1.0.0-rc1-final" - } - } -} \ No newline at end of file diff --git a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj index c429307..0eaefd6 100644 --- a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj +++ b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj @@ -1,13 +1,9 @@  - net4.8;net8.0 + net4.8;net8.0;net9.0 Serilog.Sinks.Seq.Tests - ../../assets/Serilog.snk - true - true true - latest - enable + false From 6815d7307b477747e05e782f7dfbcff8c8dd20a2 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 2 Dec 2024 15:36:53 +1000 Subject: [PATCH 2/4] Remove unused usings --- sample/Sample/Program.cs | 5 +---- src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs | 3 --- src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs | 3 --- src/Serilog.Sinks.Seq/Sinks/Seq/Batched/BatchedSeqSink.cs | 4 ---- .../Sinks/Seq/ConstrainedBufferedFormatter.cs | 2 -- .../Sinks/Seq/Conventions/PreserveDottedPropertyNames.cs | 1 - .../Sinks/Seq/Conventions/UnflattenDottedPropertyNames.cs | 3 --- src/Serilog.Sinks.Seq/Sinks/Seq/Durable/BookmarkFile.cs | 2 -- src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs | 1 - .../Seq/Durable/ExponentialBackoffConnectionSchedule.cs | 2 -- src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs | 4 ---- src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs | 4 ---- src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs | 2 -- src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApi.cs | 3 --- .../Sinks/Seq/Http/SeqIngestionApiClient.cs | 3 --- .../Sinks/Seq/IDottedPropertyNameConvention.cs | 1 - src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs | 3 --- src/Serilog.Sinks.Seq/Sinks/Seq/SeqCompactJsonFormatter.cs | 3 --- test/Serilog.Sinks.Seq.Tests/Audit/SeqAuditSinkTests.cs | 4 +--- test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs | 1 - .../ConstrainedBufferedFormatterTests.cs | 3 +-- .../Conventions/UnflattenDottedPropertyNamesTests.cs | 2 -- test/Serilog.Sinks.Seq.Tests/Durable/DurableSeqSinkTests.cs | 4 ---- test/Serilog.Sinks.Seq.Tests/Durable/FileSetTests.cs | 3 +-- test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs | 4 +--- test/Serilog.Sinks.Seq.Tests/SeqCompactJsonFormatterTests.cs | 2 -- test/Serilog.Sinks.Seq.Tests/Support/NastyException.cs | 4 +--- test/Serilog.Sinks.Seq.Tests/Support/SelfLogCollector.cs | 3 --- test/Serilog.Sinks.Seq.Tests/Support/Some.cs | 4 +--- test/Serilog.Sinks.Seq.Tests/Support/TempFolder.cs | 4 +--- test/Serilog.Sinks.Seq.Tests/Support/TestIngestionApi.cs | 5 +---- 31 files changed, 9 insertions(+), 83 deletions(-) diff --git a/sample/Sample/Program.cs b/sample/Sample/Program.cs index f2f15b5..9d8cc3a 100644 --- a/sample/Sample/Program.cs +++ b/sample/Sample/Program.cs @@ -1,7 +1,4 @@ -using System; -using System.Linq; -using System.Threading; -using Serilog; +using Serilog; using Serilog.Core; using Serilog.Debugging; diff --git a/src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs b/src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs index 3ca552a..c6cd789 100644 --- a/src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs +++ b/src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs @@ -12,13 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.Globalization; using Serilog.Configuration; using Serilog.Core; using Serilog.Events; using Serilog.Sinks.Seq; -using System.Net.Http; using Serilog.Formatting; using Serilog.Sinks.Seq.Batched; using Serilog.Sinks.Seq.Audit; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs index 16e559b..7fb5d0c 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs @@ -12,9 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.IO; -using System.Threading.Tasks; using Serilog.Core; using Serilog.Events; using Serilog.Formatting; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Batched/BatchedSeqSink.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Batched/BatchedSeqSink.cs index 85c16de..a292ace 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Batched/BatchedSeqSink.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Batched/BatchedSeqSink.cs @@ -12,10 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; using Serilog.Core; using Serilog.Events; using Serilog.Formatting; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/ConstrainedBufferedFormatter.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/ConstrainedBufferedFormatter.cs index 3a5f288..5e87b11 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/ConstrainedBufferedFormatter.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/ConstrainedBufferedFormatter.cs @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.IO; using System.Text; using Serilog.Debugging; using Serilog.Events; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Conventions/PreserveDottedPropertyNames.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Conventions/PreserveDottedPropertyNames.cs index 523a84f..5dd2c2b 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Conventions/PreserveDottedPropertyNames.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Conventions/PreserveDottedPropertyNames.cs @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System.Collections.Generic; using Serilog.Events; namespace Serilog.Sinks.Seq.Conventions; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Conventions/UnflattenDottedPropertyNames.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Conventions/UnflattenDottedPropertyNames.cs index 11fd55e..c234d47 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Conventions/UnflattenDottedPropertyNames.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Conventions/UnflattenDottedPropertyNames.cs @@ -12,10 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using Serilog.Events; namespace Serilog.Sinks.Seq.Conventions; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/BookmarkFile.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/BookmarkFile.cs index ba794d5..c0195e1 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/BookmarkFile.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/BookmarkFile.cs @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.IO; using System.Text; namespace Serilog.Sinks.Seq.Durable; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs index 1b72e77..4b6a3ff 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; using Serilog.Core; using Serilog.Events; using System.Text; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/ExponentialBackoffConnectionSchedule.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/ExponentialBackoffConnectionSchedule.cs index c5425b6..c258efb 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/ExponentialBackoffConnectionSchedule.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/ExponentialBackoffConnectionSchedule.cs @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; - namespace Serilog.Sinks.Seq.Durable; /// diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs index b384f3a..da16ef8 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs @@ -12,10 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; using System.Net; using System.Text.RegularExpressions; using Serilog.Debugging; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs index e379751..6d913f3 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs @@ -12,15 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.IO; -using System.Linq; using System.Net; using System.Text; using Serilog.Debugging; using Serilog.Events; using IOFile = System.IO.File; -using System.Threading.Tasks; using Serilog.Sinks.Seq.Http; #if HRESULTS diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs index 0af1a45..dd52571 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs @@ -12,9 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; using System.Diagnostics.CodeAnalysis; -using System.IO; using System.Text; using Serilog.Debugging; using Serilog.Sinks.Seq.Http; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApi.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApi.cs index 402c56d..8a9bcde 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApi.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApi.cs @@ -12,9 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.Net.Http; -using System.Threading.Tasks; using Serilog.Debugging; using Serilog.Events; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApiClient.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApiClient.cs index c95fa2f..14bed1c 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApiClient.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Http/SeqIngestionApiClient.cs @@ -12,11 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.Net.Http; using System.Runtime.InteropServices; using System.Text; -using System.Threading.Tasks; using Serilog.Events; namespace Serilog.Sinks.Seq.Http; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/IDottedPropertyNameConvention.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/IDottedPropertyNameConvention.cs index 9cedffc..9359739 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/IDottedPropertyNameConvention.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/IDottedPropertyNameConvention.cs @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System.Collections.Generic; using Serilog.Events; namespace Serilog.Sinks.Seq; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs index 86a2875..900d326 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs @@ -13,9 +13,6 @@ // limitations under the License. using Serilog.Debugging; -using System; -using System.Threading; -using System.Threading.Tasks; namespace Serilog.Sinks.Seq; diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/SeqCompactJsonFormatter.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqCompactJsonFormatter.cs index 03e40fb..fbf6328 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/SeqCompactJsonFormatter.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqCompactJsonFormatter.cs @@ -12,11 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; using System.Diagnostics; using System.Globalization; -using System.IO; -using System.Linq; using Serilog.Events; using Serilog.Formatting; using Serilog.Formatting.Json; diff --git a/test/Serilog.Sinks.Seq.Tests/Audit/SeqAuditSinkTests.cs b/test/Serilog.Sinks.Seq.Tests/Audit/SeqAuditSinkTests.cs index 02cd774..e38bb88 100644 --- a/test/Serilog.Sinks.Seq.Tests/Audit/SeqAuditSinkTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/Audit/SeqAuditSinkTests.cs @@ -1,6 +1,4 @@ -using System; -using System.Net.Http; -using System.Threading.Tasks; +using System.Net.Http; using Serilog.Debugging; using Serilog.Events; using Serilog.Sinks.Seq.Audit; diff --git a/test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs b/test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs index 679e6df..13e64a4 100644 --- a/test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs @@ -1,5 +1,4 @@ using System.Net; -using System.Threading.Tasks; using Serilog.Core; using Serilog.Events; using Serilog.Sinks.Seq.Batched; diff --git a/test/Serilog.Sinks.Seq.Tests/ConstrainedBufferedFormatterTests.cs b/test/Serilog.Sinks.Seq.Tests/ConstrainedBufferedFormatterTests.cs index ff8d839..a851db4 100644 --- a/test/Serilog.Sinks.Seq.Tests/ConstrainedBufferedFormatterTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/ConstrainedBufferedFormatterTests.cs @@ -1,5 +1,4 @@ -using System.IO; -using Serilog.Sinks.Seq.Tests.Support; +using Serilog.Sinks.Seq.Tests.Support; using Xunit; namespace Serilog.Sinks.Seq.Tests; diff --git a/test/Serilog.Sinks.Seq.Tests/Conventions/UnflattenDottedPropertyNamesTests.cs b/test/Serilog.Sinks.Seq.Tests/Conventions/UnflattenDottedPropertyNamesTests.cs index e6bbf15..de464bb 100644 --- a/test/Serilog.Sinks.Seq.Tests/Conventions/UnflattenDottedPropertyNamesTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/Conventions/UnflattenDottedPropertyNamesTests.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; -using System.Linq; using Serilog.Events; using Serilog.Sinks.Seq.Conventions; using Xunit; diff --git a/test/Serilog.Sinks.Seq.Tests/Durable/DurableSeqSinkTests.cs b/test/Serilog.Sinks.Seq.Tests/Durable/DurableSeqSinkTests.cs index 240fabc..daedbcd 100644 --- a/test/Serilog.Sinks.Seq.Tests/Durable/DurableSeqSinkTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/Durable/DurableSeqSinkTests.cs @@ -1,8 +1,4 @@ -using System; -using System.IO; using System.Net; -using System.Threading; -using System.Threading.Tasks; using Serilog.Sinks.Seq.Durable; using Serilog.Sinks.Seq.Http; using Serilog.Sinks.Seq.Tests.Support; diff --git a/test/Serilog.Sinks.Seq.Tests/Durable/FileSetTests.cs b/test/Serilog.Sinks.Seq.Tests/Durable/FileSetTests.cs index c08689b..e81bb05 100644 --- a/test/Serilog.Sinks.Seq.Tests/Durable/FileSetTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/Durable/FileSetTests.cs @@ -1,5 +1,4 @@ -using System.IO; -using Serilog.Sinks.Seq.Durable; +using Serilog.Sinks.Seq.Durable; using Serilog.Sinks.Seq.Tests.Support; using Xunit; diff --git a/test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs b/test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs index dbbba44..873a2f4 100644 --- a/test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs @@ -1,6 +1,4 @@ -using System; -using System.IO; -using System.Text; +using System.Text; using Newtonsoft.Json; using Serilog.Sinks.Seq.Durable; using Serilog.Sinks.Seq.Http; diff --git a/test/Serilog.Sinks.Seq.Tests/SeqCompactJsonFormatterTests.cs b/test/Serilog.Sinks.Seq.Tests/SeqCompactJsonFormatterTests.cs index c35b829..66b4b82 100644 --- a/test/Serilog.Sinks.Seq.Tests/SeqCompactJsonFormatterTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/SeqCompactJsonFormatterTests.cs @@ -1,10 +1,8 @@ // This file originally CompactJsonFormatterTests from https://github.com/serilog/serilog-formatting-compact, // Copyright Serilog Contributors and distributed under the Apache 2.0 license. -using System; using System.Diagnostics; using System.Globalization; -using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Serilog.Events; diff --git a/test/Serilog.Sinks.Seq.Tests/Support/NastyException.cs b/test/Serilog.Sinks.Seq.Tests/Support/NastyException.cs index 94a8ded..7d7b22e 100644 --- a/test/Serilog.Sinks.Seq.Tests/Support/NastyException.cs +++ b/test/Serilog.Sinks.Seq.Tests/Support/NastyException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Serilog.Sinks.Seq.Tests.Support; +namespace Serilog.Sinks.Seq.Tests.Support; public class NastyException : Exception { diff --git a/test/Serilog.Sinks.Seq.Tests/Support/SelfLogCollector.cs b/test/Serilog.Sinks.Seq.Tests/Support/SelfLogCollector.cs index ae0fa2c..a97bcb9 100644 --- a/test/Serilog.Sinks.Seq.Tests/Support/SelfLogCollector.cs +++ b/test/Serilog.Sinks.Seq.Tests/Support/SelfLogCollector.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Threading; using Serilog.Debugging; namespace Serilog.Sinks.Seq.Tests.Support; diff --git a/test/Serilog.Sinks.Seq.Tests/Support/Some.cs b/test/Serilog.Sinks.Seq.Tests/Support/Some.cs index 60c2203..3b624fc 100644 --- a/test/Serilog.Sinks.Seq.Tests/Support/Some.cs +++ b/test/Serilog.Sinks.Seq.Tests/Support/Some.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using Serilog.Events; +using Serilog.Events; using Xunit.Sdk; namespace Serilog.Sinks.Seq.Tests.Support; diff --git a/test/Serilog.Sinks.Seq.Tests/Support/TempFolder.cs b/test/Serilog.Sinks.Seq.Tests/Support/TempFolder.cs index 2e60c1f..27123c6 100644 --- a/test/Serilog.Sinks.Seq.Tests/Support/TempFolder.cs +++ b/test/Serilog.Sinks.Seq.Tests/Support/TempFolder.cs @@ -1,6 +1,4 @@ -using System; -using System.Diagnostics; -using System.IO; +using System.Diagnostics; using System.Runtime.CompilerServices; namespace Serilog.Sinks.Seq.Tests.Support; diff --git a/test/Serilog.Sinks.Seq.Tests/Support/TestIngestionApi.cs b/test/Serilog.Sinks.Seq.Tests/Support/TestIngestionApi.cs index 0555b06..fec3e43 100644 --- a/test/Serilog.Sinks.Seq.Tests/Support/TestIngestionApi.cs +++ b/test/Serilog.Sinks.Seq.Tests/Support/TestIngestionApi.cs @@ -1,8 +1,5 @@ -using System; -using System.Net; -using System.Threading; +using System.Net; using System.Threading.Channels; -using System.Threading.Tasks; using Serilog.Sinks.Seq.Http; namespace Serilog.Sinks.Seq.Tests.Support; From 97edc19ee1ffa86bcc0552a1d70377b604da3c83 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 2 Dec 2024 15:40:21 +1000 Subject: [PATCH 3/4] Language version updates --- .../Sinks/Seq/ConstrainedBufferedFormatter.cs | 14 ++++++-------- .../Sinks/Seq/Durable/DurableSeqSink.cs | 2 +- src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs | 2 +- src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs | 1 + .../Batched/BatchedSeqSinkTests.cs | 7 +++---- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/ConstrainedBufferedFormatter.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/ConstrainedBufferedFormatter.cs index 5e87b11..53dfc4a 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/ConstrainedBufferedFormatter.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/ConstrainedBufferedFormatter.cs @@ -87,10 +87,9 @@ static LogEvent CreateNonFormattableEventPlaceholder(LogEvent logEvent, Exceptio LogEventLevel.Error, ex, new MessageTemplateParser().Parse("Event with message template {OriginalMessageTemplate} could not be formatted as JSON"), - new[] - { - new LogEventProperty("OriginalMessageTemplate", new ScalarValue(logEvent.MessageTemplate.Text)), - }); + [ + new LogEventProperty("OriginalMessageTemplate", new ScalarValue(logEvent.MessageTemplate.Text)) + ]); } static bool CheckEventBodySize(string jsonLine, long? eventBodyLimitBytes) @@ -111,11 +110,10 @@ static LogEvent CreateOversizeEventPlaceholder(LogEvent logEvent, string jsonLin LogEventLevel.Error, exception: null, new MessageTemplateParser().Parse("Event JSON representation exceeds the body size limit {EventBodyLimitBytes}; sample: {EventBodySample}"), - new[] - { + [ new LogEventProperty("EventBodyLimitBytes", new ScalarValue(eventBodyLimitBytes)), - new LogEventProperty("EventBodySample", new ScalarValue(sample)), - }); + new LogEventProperty("EventBodySample", new ScalarValue(sample)) + ]); } internal static long GetOversizeEventSampleLength(long eventBodyLimitBytes) diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs index 4b6a3ff..9927045 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs @@ -73,7 +73,7 @@ public void Dispose() } #if ASYNC_DISPOSE - public async System.Threading.Tasks.ValueTask DisposeAsync() + public async ValueTask DisposeAsync() { await _sink.DisposeAsync().ConfigureAwait(false); await _shipper.DisposeAsync().ConfigureAwait(false); diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs index da16ef8..1529a36 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs @@ -41,7 +41,7 @@ public FileSet(string bufferBaseFilename) // The extension cannot be matched here because it may be either "json" (raw format) or "clef" (compact). _candidateSearchPath = Path.GetFileName(bufferBaseFilename) + "-*.*"; - _filenameMatcher = new Regex("^" + Regex.Escape(Path.GetFileName(bufferBaseFilename)) + "-(?\\d{8})(?_[0-9]{3,}){0,1}\\.(?json|clef)$"); + _filenameMatcher = new Regex("^" + Regex.Escape(Path.GetFileName(bufferBaseFilename)) + @"-(?\d{8})(?_[0-9]{3,}){0,1}\.(?json|clef)$"); } public BookmarkFile OpenBookmarkFile() diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs index 900d326..2b58d2d 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/PortableTimer.cs @@ -47,6 +47,7 @@ public void Start(TimeSpan interval) } } + // ReSharper disable once AsyncVoidMethod async void OnTick() { try diff --git a/test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs b/test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs index 13e64a4..b59d0b3 100644 --- a/test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/Batched/BatchedSeqSinkTests.cs @@ -28,11 +28,10 @@ public async Task EventsAreFormattedIntoPayloads() var api = new TestIngestionApi(); var sink = new BatchedSeqSink(api, new SeqCompactJsonFormatter(), null, new ControlledLevelSwitch()); - await sink.EmitBatchAsync(new[] - { + await sink.EmitBatchAsync([ Some.InformationEvent("first"), Some.InformationEvent("second") - }); + ]); var emitted = await api.GetPayloadAsync(); @@ -48,7 +47,7 @@ public async Task MinimumLevelIsControlled() var api = new TestIngestionApi(_ => Task.FromResult(new IngestionResult(true, HttpStatusCode.Accepted, newLevel))); var sink = new BatchedSeqSink(api, new SeqCompactJsonFormatter(), null, new ControlledLevelSwitch(levelSwitch)); - await sink.EmitBatchAsync(new[] { Some.InformationEvent() }); + await sink.EmitBatchAsync([Some.InformationEvent()]); Assert.Equal(newLevel, levelSwitch.MinimumLevel); } From 529f91a0e000ac81d3a4fc2de3e4c6b9269244a6 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 2 Dec 2024 15:59:10 +1000 Subject: [PATCH 4/4] README update --- README.md | 2 +- serilog-sinks-seq.sln | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 70ed47d..e269228 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Serilog.Sinks.Seq [![Build status](https://ci.appveyor.com/api/projects/status/uwkn795klja7u74f/branch/dev?svg=true)](https://ci.appveyor.com/project/datalust/serilog-sinks-seq/branch/dev) [![NuGet](https://img.shields.io/nuget/v/Serilog.Sinks.Seq.svg)](https://nuget.org/packages/serilog.sinks.seq) +# Serilog.Sinks.Seq [![Build status](https://github.com/datalust/serilog-sinks-seq/actions/workflows/ci.yml/badge.svg?branch=dev)](https://github.com/datalust/serilog-sinks-seq/actions) [![NuGet](https://img.shields.io/nuget/v/Serilog.Sinks.Seq.svg)](https://nuget.org/packages/serilog.sinks.seq) A Serilog sink that writes events to the [Seq](https://datalust.co/seq) structured log server. Supports all modern .NET platforms. diff --git a/serilog-sinks-seq.sln b/serilog-sinks-seq.sln index d1ae675..d469d68 100644 --- a/serilog-sinks-seq.sln +++ b/serilog-sinks-seq.sln @@ -21,7 +21,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample", "sample\Sample\Sam EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serilog.Sinks.Seq.Tests", "test\Serilog.Sinks.Seq.Tests\Serilog.Sinks.Seq.Tests.csproj", "{3C2D8E01-5580-426A-BDD9-EC59CD98E618}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sln", "sln", "{27A8DEB5-B04B-4DCB-8CF2-0049E5EE66AF}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".sln", ".sln", "{27A8DEB5-B04B-4DCB-8CF2-0049E5EE66AF}" ProjectSection(SolutionItems) = preProject Build.ps1 = Build.ps1 README.md = README.md