Skip to content

Commit f87b10f

Browse files
authored
Use multi targets projects for coverlet.collector, coverlet.msbuild.tasks packages (#1742)
* Update .NET versions and project configurations - Set `NetCurrent` to `net9.0` and `NetMinimum` to `net8.0` in `Directory.Build.props`. - Updated SDK version in `global.json` to `9.0.203`. - Changed target frameworks in `coverlet.collector.csproj`, `coverlet.console.csproj`, `coverlet.core.csproj`, and `coverlet.msbuild.tasks.csproj` to support multiple frameworks. - Modified `CoverletToolsPath` in `Directory.Build.targets` to include `netstandard2.0`. - Updated coverage file naming in `Msbuild.cs` to reflect the build target framework. * update build.yml .NET SDK versions * check net9.0 instead of net6.0 * fix log file names * update targetFrameworks and documentation * enable TestingPlatformDotnetTestSupport * remove net6.0 from build script * update scripts * fix parameters * add method GetSourceRootMappingFilePath * delete wrong file * improve nuget packaging * Update SDK and Directory.Packages.props * update .NET SDK and nuget package versions * fix deprecated warning message * update xunit package version * Update CI builds for multi-targeting and simplify test logic Updated Azure Pipelines to install .NET SDK 8.0.414 explicitly, replacing reliance on `global.json`. Enhanced `DeterministicBuild.cs` to improve target framework parsing with better error handling. Simplified test file path handling in `Msbuild.cs` by removing conditional logic and using wildcard patterns for assertions. Added `NU1701` to `MSBuildWarningsAsMessages` in `coverlet.integration.determisticbuild.csproj`. Removed platform-specific test skip for `net48` and cleaned up unused imports and redundant code in `Msbuild.cs`. Fixed copyright header encoding in `DeterministicBuild.cs`.
1 parent db04e69 commit f87b10f

File tree

27 files changed

+218
-162
lines changed

27 files changed

+218
-162
lines changed

Directory.Build.props

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
<Project>
33
<PropertyGroup>
44
<RepoRoot>$(MSBuildThisFileDirectory)</RepoRoot>
5+
<NetCurrent>net9.0</NetCurrent>
6+
<NetMinimum>net8.0</NetMinimum>
7+
<FullFrameworkTFM>net472</FullFrameworkTFM>
58
<!-- enforce CamelCase case string-->
69
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
710
<!-- SourceLink Setup -->
@@ -39,12 +42,12 @@
3942
</ItemGroup>
4043

4144
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT' ">
42-
<VSTestResultsDirectory>$(RepoRoot)artifacts/testresults/$(Configuration.ToLowerInvariant())</VSTestResultsDirectory>
45+
<VSTestResultsDirectory>$(RepoRoot)artifacts/reports/$(Configuration.ToLowerInvariant())</VSTestResultsDirectory>
4346
<VSTestLogger>@(VSTestLogger)</VSTestLogger>
4447
</PropertyGroup>
4548

4649
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
47-
<VSTestResultsDirectory>$(RepoRoot)artifacts\testresults\$(Configuration.ToLowerInvariant())</VSTestResultsDirectory>
50+
<VSTestResultsDirectory>$(RepoRoot)artifacts\reports\$(Configuration.ToLowerInvariant())</VSTestResultsDirectory>
4851
<VSTestLogger>@(VSTestLogger)</VSTestLogger>
4952
</PropertyGroup>
5053

Directory.Packages.props

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,6 @@
2929
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.3" />
3030
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkVersion)" />
3131
<PackageVersion Include="Microsoft.TestPlatform.ObjectModel" Version="$(MicrosoftNETTestSdkVersion)" />
32-
<!-- Microsoft.TestPlatform.ObjectModel has a dependency to NuGet.Frameworks with specific version -->
33-
<!-- https://github.com/microsoft/vstest/blob/9a0c41811637edf4afe0e265e08fdd1cb18109ed/src/Microsoft.TestPlatform.ObjectModel/Microsoft.TestPlatform.ObjectModel.csproj#L36-->
34-
<!-- wrong configuration will create "build\coverlet.msbuild.targets(72,5): error : Unable to read beyond the end of the stream." -->
35-
<!--
36-
vstest 17.5 version /scripts/build/TestPlatform.Dependencies.props
37-
https://github.com/microsoft/vstest/blob/81f87947b316a4faf2bcb5b8c8fa1591baafcc39/scripts/build/TestPlatform.Dependencies.props#L57
38-
vstest 17.8 version
39-
NuGetFrameworksVersion is defined here https://github.com/microsoft/vstest/blob/9a0c41811637edf4afe0e265e08fdd1cb18109ed/eng/Versions.props#L94C1-L94C1
40-
-->
4132
<PackageVersion Include="NuGet.Frameworks" Version="$(NugetPackageVersion)" />
4233
<PackageVersion Include="NuGet.Packaging" Version="$(NugetPackageVersion)" />
4334
<PackageVersion Include="NuGet.Versioning" Version="$(NugetPackageVersion)" />

Documentation/VSTestIntegration.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Since version `8.0.0`
77
* .NET Core >= 8.0
88
* .NET Framework >= 4.7.2
99

10-
As explained in quick start section, to use collectors you need to run *SDK v8.0.411* (LTS) or newer and your project file must reference `coverlet.collector` and a minimum version of `Microsoft.NET.Test.Sdk`.
10+
As explained in quick start section, to use collectors you need to run *SDK v8.0.414* (LTS) or newer and your project file must reference `coverlet.collector` and a minimum version of `Microsoft.NET.Test.Sdk`.
1111

1212
A sample project file looks like:
1313

eng/azure-pipelines-nightly.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ pool:
22
vmImage: 'windows-latest'
33

44
steps:
5+
- task: UseDotNet@2
6+
inputs:
7+
version: 8.0.414
8+
displayName: Install .NET Core SDK 8.0.412
9+
510
- task: UseDotNet@2
611
inputs:
712
useGlobalJson: true

eng/build.sh

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ dotnet pack -c release
2222
dotnet build-server shutdown
2323

2424
# Run tests with code coverage
25-
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"
25+
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/debug/coverlet.collector.test.log;tracelevel=verbose"
2626
dotnet build-server shutdown
27-
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"
27+
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/debug/coverlet.core.tests.log
2828
dotnet build-server shutdown
29-
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"
29+
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 "coverlet.core.coverage.tests.trx" --diagnostic-verbosity debug --diagnostic --diagnostic-output-directory "$(pwd)/artifacts/log/debug"
3030
dotnet build-server shutdown
31-
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"
31+
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/debug/coverlet.msbuild.tasks.tests.log
3232
dotnet build-server shutdown
33-
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"
33+
dotnet test test/coverlet.integration.tests -f net8.0 --results-directory:"./artifacts/reports" --verbosity detailed --diag ./artifacts/log/debug/coverlet.integration.tests.net8.log
34+
dotnet test test/coverlet.integration.tests -f net9.0 --results-directory:"./artifacts/reports" --verbosity detailed --diag ./artifacts/log/debug/coverlet.integration.tests.net9.log

eng/build.yml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
steps:
2+
- task: UseDotNet@2
3+
inputs:
4+
version: 8.0.412
5+
displayName: Install .NET Core SDK 8.0.8.0.414
6+
27
- task: UseDotNet@2
38
inputs:
49
useGlobalJson: true
@@ -34,11 +39,12 @@ steps:
3439
displayName: Pack
3540

3641
- script: |
37-
dotnet test test/coverlet.core.tests/coverlet.core.tests.csproj -c $(BuildConfiguration) --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 "$(Build.SourcesDirectory)/artifacts/Reports" --report-xunit-trx --report-xunit-trx-filename "coverlet.core.tests.trx" --diagnostic --diagnostic-output-directory "$(Build.SourcesDirectory)/artifacts/log/$(buildConfiguration)" --diagnostic-output-fileprefix "coverlet.core.tests"
38-
dotnet test test/coverlet.core.coverage.tests/coverlet.core.coverage.tests.csproj -c $(BuildConfiguration) --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 "$(Build.SourcesDirectory)/artifacts/Reports" --report-xunit-trx --report-xunit-trx-filename "coverlet.core.coverage.tests.trx" --diagnostic --diagnostic-output-directory "$(Build.SourcesDirectory)/artifacts/log/$(buildConfiguration)" --diagnostic-output-fileprefix "coverlet.core.coverage.tests"
39-
dotnet test test/coverlet.msbuild.tasks.tests/coverlet.msbuild.tasks.tests.csproj -c $(BuildConfiguration) --no-build -bl:test.msbuild.binlog --results-directory:"$(Build.SourcesDirectory)\artifacts\Reports" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*%2c[coverlet.tests.xunit.extensions]*%2c[coverlet.tests.projectsample]*%2c[testgen_]*" /p:ExcludeByAttribute="GeneratedCodeAttribute" --diag:"$(Build.SourcesDirectory)\artifacts\log\$(buildConfiguration)\coverlet.msbuild.test.diag.log;tracelevel=verbose"
40-
dotnet test test/coverlet.collector.tests/coverlet.collector.tests.csproj -c $(BuildConfiguration) --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:"$(Build.SourcesDirectory)/artifacts/log/$(buildConfiguration)/coverlet.collector.test.diag.log;tracelevel=verbose"
41-
dotnet test test/coverlet.integration.tests/coverlet.integration.tests.csproj -c $(BuildConfiguration) --no-build -bl:test.integration.binlog -- --results-directory "$(Build.SourcesDirectory)/artifacts/Reports" --report-xunit-trx --report-xunit-trx-filename "coverlet.integration.tests.trx" --diagnostic --diagnostic-output-directory "$(Build.SourcesDirectory)/artifacts/log/$(buildConfiguration)" --diagnostic-output-fileprefix "coverlet.integration.tests"
42+
dotnet test test/coverlet.core.tests/coverlet.core.tests.csproj -c $(BuildConfiguration) --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" --diag:"$(Build.SourcesDirectory)/artifacts/log/coverlet.core.tests.diag.$(buildConfiguration).log;tracelevel=verbose"
43+
dotnet test test/coverlet.core.coverage.tests/coverlet.core.coverage.tests.csproj -c $(BuildConfiguration) --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 "$(Build.SourcesDirectory))/artifacts/reports" --report-xunit-trx --report-xunit-trx-filename "coverlet.core.coverage.tests.trx" --diagnostic-verbosity debug --diagnostic --diagnostic-output-directory "$(Build.SourcesDirectory)/artifacts/log/$(BuildConfiguration)"
44+
dotnet test test/coverlet.msbuild.tasks.tests\coverlet.msbuild.tasks.tests.csproj -c $(BuildConfiguration) --no-build -bl:test.msbuild.tasks.binlog /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:Exclude="[coverlet.core.tests.samples.netstandard]*%2c[coverlet.tests.projectsample]*" /p:ExcludeByAttribute="GeneratedCodeAttribute" --diag:"$(Build.SourcesDirectory)/artifacts/log/coverlet.msbuild.tasks.tests.diag.$(buildConfiguration).log;tracelevel=verbose"
45+
dotnet test test/coverlet.collector.tests/coverlet.collector.tests.csproj -c $(BuildConfiguration) --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:"$(Build.SourcesDirectory)/artifacts/log/coverlet.collector.tests.diag.$(buildConfiguration).log;tracelevel=verbose"
46+
dotnet test test/coverlet.integration.tests/coverlet.integration.tests.csproj -c $(BuildConfiguration) -f net8.0 --no-build -bl:test.integration.binlog --diag:"$(Build.SourcesDirectory)/artifacts/log/coverlet.integration.tests.diag.net8.0.$(buildConfiguration).log;tracelevel=verbose"
47+
dotnet test test/coverlet.integration.tests/coverlet.integration.tests.csproj -c $(BuildConfiguration) -f net9.0 --no-build -bl:test.integration.binlog --diag:"$(Build.SourcesDirectory)/artifacts/log/coverlet.integration.tests.diag.net9.0.$(buildConfiguration).log;tracelevel=verbose"
4248
displayName: Run unit tests with coverage
4349
env:
4450
MSBUILDDISABLENODEREUSE: 1

eng/publish-coverlet-result-files.yml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ steps:
1515
**/log.txt
1616
**/log.datacollector.*.txt
1717
**/log.host.*.txt
18+
**/coverlet.integration.tests.diag*.log
19+
**/coverlet.collector.tests.diag*.log
20+
**/coverlet.msbuild.tasks.tests.diag*.log
21+
**/coverlet.core.coverage.tests.diag*.log
22+
**/coverlet.core.tests.diag*.log
1823
TargetFolder: '$(Build.SourcesDirectory)/artifacts/TestLogs'
1924

2025
- task: CopyFiles@2
@@ -34,7 +39,15 @@ steps:
3439
condition: always()
3540
inputs:
3641
SourceFolder: '$(Build.SourcesDirectory)'
37-
Contents: '**/*.binlog'
42+
Contents: '*.binlog'
43+
TargetFolder: '$(Build.SourcesDirectory)/artifacts/TestLogs'
44+
45+
- task: CopyFiles@2
46+
displayName: Copy DeterministicBuild binlog files
47+
condition: always()
48+
inputs:
49+
SourceFolder: '$(Build.SourcesDirectory)'
50+
Contents: 'test\coverlet.integration.determisticbuild\*.binlog'
3851
TargetFolder: '$(Build.SourcesDirectory)/artifacts/TestLogs'
3952

4053
- task: PublishPipelineArtifact@1

global.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"sdk": {
3-
"version": "8.0.414"
3+
"version": "9.0.307"
44
}
55
}

src/coverlet.collector/coverlet.collector.csproj

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFramework>netstandard2.0</TargetFramework>
3+
<TargetFrameworks>$(NetMinimum);netstandard2.0</TargetFrameworks>
44
<AssemblyTitle>coverlet.collector</AssemblyTitle>
55
<DevelopmentDependency>true</DevelopmentDependency>
66
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
@@ -39,6 +39,8 @@
3939
<ItemGroup>
4040
<PackageReference Include="Microsoft.TestPlatform.ObjectModel" />
4141
<PackageReference Include="NuGet.Frameworks" />
42+
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" />
43+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
4244
</ItemGroup>
4345

4446
<ItemGroup>
@@ -52,20 +54,20 @@
5254
<ProjectReference Include="$(MSBuildThisFileDirectory)..\coverlet.core\coverlet.core.csproj" />
5355
</ItemGroup>
5456

57+
<!-- NuGet package layout -->
58+
<!-- NuGet folders https://learn.microsoft.com/nuget/create-packages/creating-a-package#from-a-convention-based-working-directory -->
5559
<ItemGroup>
56-
<None Include="build\coverlet.collector.targets">
57-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
58-
</None>
60+
<TfmSpecificPackageFile Include="build/**">
61+
<PackagePath>build/$(TargetFramework)</PackagePath>
62+
</TfmSpecificPackageFile>
5963
</ItemGroup>
6064

61-
<Target Name="PackBuildOutputs" DependsOnTargets="BuildOnlySettings;ResolveReferences">
65+
<Target Name="PackBuildOutputs" DependsOnTargets="ResolveReferences">
6266
<ItemGroup>
63-
<TfmSpecificPackageFile Include="build\coverlet.collector.targets" PackagePath="build\$(TargetFramework)" />
64-
<TfmSpecificPackageFile Include="$(TargetPath)" PackagePath="build\$(TargetFramework)" />
65-
<TfmSpecificPackageFile Include="$(ProjectDepsFilePath)" PackagePath="build\$(TargetFramework)" />
66-
<TfmSpecificPackageFile Include="@(DebugSymbolsProjectOutputGroupOutput)" PackagePath="build\$(TargetFramework)" />
67+
<TfmSpecificPackageFile Include="$(TargetPath);$(ProjectDepsFilePath);@(DebugSymbolsProjectOutputGroupOutput)" PackagePath="build\$(TargetFramework)" />
6768
<TfmSpecificPackageFile Include="%(_ResolvedProjectReferencePaths.Identity)" PackagePath="build\$(TargetFramework)" />
6869
<TfmSpecificPackageFile Include="@(ReferenceCopyLocalPaths)" Exclude="@(_ResolvedProjectReferencePaths)" PackagePath="build\$(TargetFramework)\%(ReferenceCopyLocalPaths.DestinationSubPath)" />
6970
</ItemGroup>
7071
</Target>
72+
7173
</Project>

src/coverlet.console/coverlet.console.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net8.0</TargetFramework>
5+
<TargetFrameworks>$(NetMinimum)</TargetFrameworks>
66
<ToolCommandName>coverlet</ToolCommandName>
77
<PackAsTool>true</PackAsTool>
88
<AssemblyTitle>coverlet.console</AssemblyTitle>
@@ -24,6 +24,7 @@
2424

2525
<ItemGroup>
2626
<PackageReference Include="System.CommandLine" />
27+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
2728
</ItemGroup>
2829

2930
<ItemGroup>

0 commit comments

Comments
 (0)