diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 000000000..3c57db94d
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,49 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
+{
+ "name": "coverlet .NET 9.0)",
+ // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
+ "image": "mcr.microsoft.com/devcontainers/dotnet:1-9.0-bookworm",
+ "features": {
+ "ghcr.io/devcontainers/features/dotnet:2": {
+ "version": "9.0.203",
+ "additionalVersions": ["6.0.428", "8.0.408"]
+ }
+ },
+
+ // Features to add to the dev container. More info: https://containers.dev/features.
+ // "features": {},
+
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
+ // "forwardPorts": [5000, 5001],
+ // "portsAttributes": {
+ // "5001": {
+ // "protocol": "https"
+ // }
+ // }
+
+ // Use 'postCreateCommand' to run commands after the container is created.
+ // "postCreateCommand": "dotnet restore",
+
+ // Configure tool-specific properties.
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "ms-dotnettools.vscode-dotnet-runtime",
+ "visualstudioexptteam.vscodeintellicode",
+ "GitHub.vscode-pull-request-github",
+ "ms-dotnettools.csharp",
+ "ms-dotnettools.dotnet-interactive-vscode",
+ "ms-dotnettools.csdevkit",
+ "ms-vscode.powershell",
+ "ms-azure-devops.azure-pipelines",
+ "streetsidesoftware.code-spell-checker",
+ "streetsidesoftware.code-spell-checker-german",
+ "streetsidesoftware.code-spell-checker-english",
+ "fernandoescolar.vscode-solution-explorer"]
+ }
+ },
+
+ // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
+ // "remoteUser": "root"
+}
diff --git a/eng/azure-pipelines-nightly.yml b/eng/azure-pipelines-nightly.yml
index ab78bae71..54b00c9ea 100644
--- a/eng/azure-pipelines-nightly.yml
+++ b/eng/azure-pipelines-nightly.yml
@@ -10,7 +10,7 @@ steps:
- task: UseDotNet@2
inputs:
useGlobalJson: true
- displayName: Install .NET Core SDK 8.0.113
+ displayName: Install .NET Core SDK 8.0.114
- task: NuGetAuthenticate@1
displayName: Authenticate with NuGet feeds
diff --git a/eng/build-all.sh b/eng/build-all.sh
new file mode 100644
index 000000000..6903526ab
--- /dev/null
+++ b/eng/build-all.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+
+# Build Script for Coverlet
+# ------------------------
+# This script provides a complete build environment setup and cleanup for Coverlet development.
+# It's designed to support fast branch switching by:
+# - Cleaning all temporary build artifacts
+# - Removing cached NuGet packages
+# - Rebuilding all projects and tests
+# - Generating new binlogs for debugging
+#
+# Key features:
+# - Cleans TestResults, bin, obj folders for clean builds
+# - Removes cached NuGet packages to prevent version conflicts
+# - Builds and packs all Coverlet projects
+# - Generates binlogs for build diagnostics
+# - Supports CI builds with ContinuousIntegrationBuild=true
+#
+# Usage: ./scripts/build-all.sh
+#
+# Note: Run this script after switching branches to ensure a clean development environment
+
+# Cleanup temp folders and files
+echo "Please cleanup temp folder!"
+dotnet build-server shutdown
+rm -f coverage.cobertura.xml
+rm -f coverage.json
+rm -f coverage.net8.0.json
+rm -f test/coverlet.integration.determisticbuild/*.binlog
+rm -rf artifacts
+
+# Clean nuget packages
+rm -rf ~/.nuget/packages/coverlet.msbuild/V1.0.0
+rm -rf ~/.nuget/packages/coverlet.collector/V1.0.0
+find . -type d \( -name "TestResults" -o -name "bin" -o -name "obj" \) -exec rm -rf {} +
+find ~/.nuget/packages -type d \( -name "coverlet.msbuild" -o -name "coverlet.collector" -o -name "coverlet.console" \) -name "8.0.0-preview*" -exec rm -rf {} +
+
+# Build and pack projects
+dotnet pack -c Debug src/coverlet.msbuild.tasks/coverlet.msbuild.tasks.csproj /p:ContinuousIntegrationBuild=true
+dotnet pack -c Debug src/coverlet.collector/coverlet.collector.csproj /p:ContinuousIntegrationBuild=true
+dotnet build -bl:build.binlog /p:ContinuousIntegrationBuild=true
+
+# Create binlog for tests
+dotnet build test/coverlet.collector.tests/coverlet.collector.tests.csproj -bl:build.collector.tests.binlog /p:ContinuousIntegrationBuild=true
+dotnet build test/coverlet.core.coverage.tests/coverlet.core.coverage.tests.csproj -bl:build.core.coverage.tests.binlog /p:ContinuousIntegrationBuild=true
+dotnet build test/coverlet.core.tests/coverlet.core.tests.csproj -bl:build.coverlet.core.tests.binlog /p:ContinuousIntegrationBuild=true
+
+# Create nuget packages
+dotnet pack -c Debug src/coverlet.msbuild.tasks/coverlet.msbuild.tasks.csproj /p:ContinuousIntegrationBuild=true
+dotnet pack -c Debug src/coverlet.collector/coverlet.collector.csproj /p:ContinuousIntegrationBuild=true
+dotnet pack -c Debug src/coverlet.console/coverlet.console.csproj /p:ContinuousIntegrationBuild=true
+dotnet pack -c Debug src/coverlet.msbuild.tasks/coverlet.msbuild.tasks.csproj /p:ContinuousIntegrationBuild=true
+dotnet pack src/coverlet.msbuild.tasks/coverlet.msbuild.tasks.csproj /p:ContinuousIntegrationBuild=true
+dotnet pack src/coverlet.collector/coverlet.collector.csproj /p:ContinuousIntegrationBuild=true
+dotnet pack src/coverlet.console/coverlet.console.csproj /p:ContinuousIntegrationBuild=true
+dotnet pack src/coverlet.msbuild.tasks/coverlet.msbuild.tasks.csproj /p:ContinuousIntegrationBuild=true
+
+dotnet build-server shutdown
+
+# Commented out sections converted to shell script comments
+: <<'END_COMMENT'
+
+dotnet test test/coverlet.collector.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" --results-directory:"./artifacts/Reports" -c debug --no-build -bl:test.collector.binlog --diag:"artifacts/log/debug/coverlet.collector.test.diag.log;tracelevel=verbose"
+dotnet test test/coverlet.core.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" -c debug --no-build -bl:test.core.binlog
+dotnet test test/coverlet.core.coverage.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" -c debug --no-build -bl:test.core.coverage.binlog
+dotnet test test/coverlet.msbuild.tasks.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" -c debug --no-build -bl:test.msbuild.binlog
+dotnet test test/coverlet.integration.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" -c debug --no-build -bl:test.integration.binlog
+
+reportgenerator -reports:"**/*.opencover.xml" -targetdir:"artifacts/reports" -reporttypes:"HtmlInline_AzurePipelines_Dark;Cobertura" -assemblyfilters:"-xunit;-coverlet.testsubject;-Coverlet.Tests.ProjectSample.*;-coverlet.core.tests.samples.netstandard;-coverlet.tests.utils;-coverlet.tests.xunit.extensions;-coverletsamplelib.integration.template;-testgen_*"
+
+dotnet test test/coverlet.core.remote.tests/coverlet.core.remote.tests.csproj -c Debug /p:CollectCoverage=true /p:CoverletOutputFormat=opencover --diag:"artifacts/log/debug/coverlet.core.remote.test.diag.log;tracelevel=verbose"
+
+find . -name *.trx && find . -name *.opencover.xml
+END_COMMENT
\ No newline at end of file
diff --git a/eng/build.sh b/eng/build.sh
index 35b5b75b7..d14cd4fbd 100644
--- a/eng/build.sh
+++ b/eng/build.sh
@@ -15,19 +15,23 @@
#
# Note: Ensure that the .NET SDK is installed and available in the system PATH.
+# Build configuration
+BUILD_CONFIG="debug"
+
# Build the project
-dotnet build -c debug -bl:build.binlog
-dotnet pack -c debug
+dotnet build -c $BUILD_CONFIG -bl:build.binlog
+dotnet pack -c $BUILD_CONFIG
dotnet pack -c release
dotnet build-server shutdown
# Run tests with code coverage
-dotnet test test/coverlet.core.tests/coverlet.core.tests.csproj -c debug --no-build -bl:test.core.binlog /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*%2c[coverlet.tests.projectsample]*" /p:ExcludeByAttribute="GeneratedCodeAttribute" -- --results-directory "artifacts/Reports" --report-xunit-trx --report-xunit-trx-filename "coverlet.core.tests.trx" --diagnostic --diagnostic-output-directory "artifacts/log/debug" --diagnostic-output-fileprefix "coverlet.core.tests"
+dotnet test test/coverlet.collector.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" --results-directory:"./artifacts/reports" --diag:"artifacts/log/${BUILD_CONFIG}/coverlet.collector.test.log;tracelevel=verbose"
dotnet build-server shutdown
-dotnet test test/coverlet.core.coverage.tests/coverlet.core.coverage.tests.csproj -c debug --no-build -bl:test.core.coverage.binlog /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*%2c[coverlet.tests.projectsample]*" /p:ExcludeByAttribute="GeneratedCodeAttribute" -- --results-directory "artifacts/Reports" --report-xunit-trx --report-xunit-trx-filename "coverlet.core.coverage.tests.trx" --diagnostic --diagnostic-output-directory "artifacts/log/debug" --diagnostic-output-fileprefix "coverlet.core.coverage.tests"
+dotnet test test/coverlet.core.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" --results-directory:"./artifacts/reports" --verbosity detailed --diag ./artifacts/log/${BUILD_CONFIG}/coverlet.core.tests.log
dotnet build-server shutdown
-dotnet test test/coverlet.msbuild.tasks.tests/coverlet.msbuild.tasks.tests.csproj -c debug --no-build -bl:test.msbuild.binlog /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*%2c[coverlet.tests.projectsample]*" /p:ExcludeByAttribute="GeneratedCodeAttribute" -- --results-directory:"artifacts/Reports" --report-xunit-trx --report-xunit-trx-filename "coverlet.msbuild.tasks.tests.trx" --diagnostic --diagnostic-output-directory "artifacts/log/debug" --diagnostic-output-fileprefix "coverlet.msbuild.tasks.tests"
+dotnet test test/coverlet.core.coverage.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" -- --results-directory "$(pwd)/artifacts/reports" --report-xunit-trx --report-xunit-trx-filename --diagnostic-verbosity ${BUILD_CONFIG} --diagnostic --diagnostic-output-directory "$(pwd)/artifacts/log/${BUILD_CONFIG}"
dotnet build-server shutdown
-dotnet test test/coverlet.collector.tests/coverlet.collector.tests.csproj -c debug --no-build -bl:test.collector.binlog /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*%2c[coverlet.tests.projectsample]*" /p:ExcludeByAttribute="GeneratedCodeAttribute" --diag:"artifacts/log/debug/coverlet.collector.test.diag.log;tracelevel=verbose"
+dotnet test test/coverlet.msbuild.tasks.tests /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*" --results-directory:"./artifacts/reports" --verbosity detailed --diag ./artifacts/log/${BUILD_CONFIG}/coverlet.msbuild.tasks.tests.log
dotnet build-server shutdown
-dotnet test test/coverlet.integration.tests/coverlet.integration.tests.csproj -c debug --no-build -bl:test.integration.binlog -- --results-directory "artifacts/Reports" --report-xunit-trx --report-xunit-trx-filename "coverlet.integration.tests.trx" --diagnostic --diagnostic-output-directory "artifacts/log/debug" --diagnostic-output-fileprefix "coverlet.integration.tests"
+dotnet test test/coverlet.integration.tests -f net8.0 --results-directory:"./artifacts/reports" --verbosity detailed --diag ./artifacts/log/${BUILD_CONFIG}/coverlet.integration.tests.net8.log
+dotnet test test/coverlet.integration.tests -f net9.0 --results-directory:"./artifacts/reports" --verbosity detailed --diag ./artifacts/log/${BUILD_CONFIG}/coverlet.integration.tests.net9.log
diff --git a/eng/build.yml b/eng/build.yml
index 570bd0f2c..8e971f5cc 100644
--- a/eng/build.yml
+++ b/eng/build.yml
@@ -7,7 +7,7 @@ steps:
- task: UseDotNet@2
inputs:
useGlobalJson: true
- displayName: Install .NET Core SDK 8.0.113
+ displayName: Install .NET Core SDK 8.0.114
# create artifact/package folder
- pwsh: |
diff --git a/global.json b/global.json
index 6dfc6666e..0417b6523 100644
--- a/global.json
+++ b/global.json
@@ -1,5 +1,5 @@
{
"sdk": {
- "version": "8.0.407"
+ "version": "8.0.408"
}
}
diff --git a/test/Directory.Build.props b/test/Directory.Build.props
index 4001de71b..788bfe250 100644
--- a/test/Directory.Build.props
+++ b/test/Directory.Build.props
@@ -4,5 +4,11 @@
true
$(NoWarn);NU1301;IDE0007;IDE0008
+
+ true
+
diff --git a/test/coverlet.core.tests/coverlet.core.tests.csproj b/test/coverlet.core.tests/coverlet.core.tests.csproj
index ff6c28869..200c3793e 100644
--- a/test/coverlet.core.tests/coverlet.core.tests.csproj
+++ b/test/coverlet.core.tests/coverlet.core.tests.csproj
@@ -4,8 +4,6 @@
net8.0
Exe
- true
- true
true
false
$(NoWarn);CS8002