Skip to content

Commit 7299ad9

Browse files
authored
Fixing .Net 10 support (#161)
* Fixing .Net 10 support * Allowing consumers to overwrite the Swashbuckle.AspNetCore package as they please * Fixing default version that was wrongfully changed * Fixing failing tests by updating the OpenApi spec * Updating readme
1 parent 24db56f commit 7299ad9

File tree

16 files changed

+65
-27
lines changed

16 files changed

+65
-27
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ For the TLDR version:
1919
- The default value are defined in the property group on the target `ValidateOpenApi` in this file `./src/Workleap.OpenApi.MSBuild/msbuild/tools/Workleap.OpenApi.MSBuild.targets`
2020
- Users can select whether to validate the API with frontend or backend ruleset depending on how they configure the `OpenApiServiceProfile` MSBuild property ([`backend` (default)](https://github.com/workleap/wl-api-guidelines/blob/main/.spectral.backend.yaml) or [`frontend`](https://github.com/workleap/wl-api-guidelines/blob/main/.spectral.frontend.yaml)).
2121

22+
## Which Swashbuckle.AspNetCore.Cli version is used?
23+
The MSBuild task uses `Swashbuckle.AspNetCore.Cli` to generate OpenAPI specifications. The version is resolved in the following order (highest to lowest priority):
24+
25+
1. **Explicit configuration** - Set via the `OpenApiSwaggerVersion` MSBuild property:
26+
```xml
27+
<PropertyGroup>
28+
<OpenApiSwaggerVersion>10.3.0</OpenApiSwaggerVersion>
29+
</PropertyGroup>
30+
```
31+
2. Project dependency - If your project references Swashbuckle.AspNetCore (via *.csproj or Directory.Packages.props), the same version is used.
32+
3. Default version - Falls back to version 10.1.0 if no version is found.
33+
2234
## How to test locally
2335

2436
### How debug the project

src/WebApiDebugger/WebApiDebugger.csproj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55
<ImplicitUsings>enable</ImplicitUsings>
66
<IsPackable>false</IsPackable>
77
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
8-
<OpenApiEnabled>true</OpenApiEnabled>
98
</PropertyGroup>
109

1110
<ItemGroup>
12-
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6" />
11+
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.0" />
1312
</ItemGroup>
1413
<PropertyGroup>
15-
<OpenApiEnabled>false</OpenApiEnabled>
14+
<OpenApiEnabled>true</OpenApiEnabled>
1615
<OpenApiDebuggingEnabled>true</OpenApiDebuggingEnabled>
1716
<OpenApiDevelopmentMode>GenerateContract</OpenApiDevelopmentMode>
1817
</PropertyGroup>

src/WebApiDebugger/openapi-v1.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
openapi: 3.0.1
1+
# DO NOT EDIT. This is a generated file
2+
openapi: 3.0.4
23
info:
34
title: WebApiDebugger
45
version: '1.0'
@@ -35,4 +36,6 @@ components:
3536
summary:
3637
type: string
3738
nullable: true
38-
additionalProperties: false
39+
additionalProperties: false
40+
tags:
41+
- name: WeatherForecast

src/Workleap.OpenApi.MSBuild/SwaggerManager.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ namespace Workleap.OpenApi.MSBuild;
55

66
internal sealed class SwaggerManager : ISwaggerManager
77
{
8-
private const string SwaggerVersion = "9.0.4";
98
private const string DoNotEditComment = "# DO NOT EDIT. This is a generated file\n";
109
private const int MaxRetryCount = 3;
1110
private readonly IProcessWrapper _processWrapper;
@@ -14,14 +13,16 @@ internal sealed class SwaggerManager : ISwaggerManager
1413
private readonly string _swaggerDirectory;
1514
private readonly string _openApiToolsDirectoryPath;
1615
private readonly string _swaggerExecutablePath;
16+
private readonly string _swaggerVersion;
1717

18-
public SwaggerManager(ILoggerWrapper loggerWrapper, IProcessWrapper processWrapper, string openApiToolsDirectoryPath, string openApiWebApiAssemblyPath)
18+
public SwaggerManager(ILoggerWrapper loggerWrapper, IProcessWrapper processWrapper, string openApiToolsDirectoryPath, string openApiWebApiAssemblyPath, string swaggerVersion)
1919
{
2020
this._processWrapper = processWrapper;
2121
this._loggerWrapper = loggerWrapper;
2222
this._openApiWebApiAssemblyPath = openApiWebApiAssemblyPath;
2323
this._openApiToolsDirectoryPath = openApiToolsDirectoryPath;
24-
this._swaggerDirectory = Path.Combine(openApiToolsDirectoryPath, "swagger", SwaggerVersion);
24+
this._swaggerVersion = swaggerVersion;
25+
this._swaggerDirectory = Path.Combine(openApiToolsDirectoryPath, "swagger", swaggerVersion);
2526
this._swaggerExecutablePath = Path.Combine(this._swaggerDirectory, RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "swagger.exe" : "swagger");
2627
}
2728

@@ -48,13 +49,13 @@ public async Task InstallSwaggerCliAsync(CancellationToken cancellationToken)
4849
return;
4950
}
5051

51-
this._loggerWrapper.LogMessage($"🔧 Installing Swashbuckle.AspNetCore.Cli {SwaggerVersion}...");
52+
this._loggerWrapper.LogMessage($"🔧 Installing Swashbuckle.AspNetCore.Cli {this._swaggerVersion}...");
5253

5354
for (var retryCount = 0; retryCount < MaxRetryCount; retryCount++)
5455
{
5556
var result = await this._processWrapper.RunProcessAsync(
5657
"dotnet",
57-
["tool", "update", "Swashbuckle.AspNetCore.Cli", "--ignore-failed-sources", "--tool-path", this._swaggerDirectory, "--configfile", Path.Combine(this._openApiToolsDirectoryPath, "nuget.config"), "--version", SwaggerVersion],
58+
["tool", "update", "Swashbuckle.AspNetCore.Cli", "--ignore-failed-sources", "--tool-path", this._swaggerDirectory, "--configfile", Path.Combine(this._openApiToolsDirectoryPath, "nuget.config"), "--version", this._swaggerVersion],
5859
cancellationToken);
5960

6061
var isLastRetry = retryCount == MaxRetryCount - 1;
@@ -75,7 +76,7 @@ public async Task InstallSwaggerCliAsync(CancellationToken cancellationToken)
7576
break;
7677
}
7778

78-
this._loggerWrapper.LogMessage($"✅ Swashbuckle.AspNetCore.Cli {SwaggerVersion} installed successfully.");
79+
this._loggerWrapper.LogMessage($"✅ Swashbuckle.AspNetCore.Cli {this._swaggerVersion} installed successfully.");
7980
}
8081

8182
public async Task<string> GenerateOpenApiSpecAsync(string swaggerExePath, string outputOpenApiSpecPath, string documentName, CancellationToken cancellationToken)

src/Workleap.OpenApi.MSBuild/ValidateOpenApiTask.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public sealed class ValidateOpenApiTask : CancelableAsyncTask
5858
/// <summary>If warnings should be logged as errors instead.</summary>
5959
public bool OpenApiTreatWarningsAsErrors { get; set; }
6060

61+
/// <summary>The version of Swashbuckle.AspNetCore.Cli to use for generating OpenAPI specs.</summary>
62+
[Required]
63+
public string OpenApiSwaggerVersion { get; set; } = string.Empty;
64+
6165
protected override async Task<bool> ExecuteAsync(CancellationToken cancellationToken)
6266
{
6367
var loggerWrapper = new LoggerWrapper(this.Log, this.OpenApiTreatWarningsAsErrors);
@@ -73,6 +77,7 @@ protected override async Task<bool> ExecuteAsync(CancellationToken cancellationT
7377
loggerWrapper.LogMessage("{0} = '{1}'", MessageImportance.Low, nameof(this.OpenApiSpectralRulesetUrl), this.OpenApiSpectralRulesetUrl ?? "No custom ruleset provided");
7478
loggerWrapper.LogMessage("{0} = '{1}'", MessageImportance.Low, nameof(this.OpenApiSwaggerDocumentNames), string.Join(", ", this.OpenApiSwaggerDocumentNames));
7579
loggerWrapper.LogMessage("{0} = '{1}'", MessageImportance.Low, nameof(this.OpenApiSpecificationFiles), string.Join(", ", this.OpenApiSpecificationFiles));
80+
loggerWrapper.LogMessage("{0} = '{1}'", MessageImportance.Normal, nameof(this.OpenApiSwaggerVersion), this.OpenApiSwaggerVersion);
7681

7782
if (this.OpenApiSpecificationFiles.Length != this.OpenApiSwaggerDocumentNames.Length)
7883
{
@@ -88,7 +93,7 @@ protected override async Task<bool> ExecuteAsync(CancellationToken cancellationT
8893

8994
var reportsPath = Path.Combine(this.OpenApiToolsDirectoryPath, "reports");
9095
var processWrapper = new ProcessWrapper(this.StartupAssemblyPath);
91-
var swaggerManager = new SwaggerManager(loggerWrapper, processWrapper, this.OpenApiToolsDirectoryPath, this.OpenApiWebApiAssemblyPath);
96+
var swaggerManager = new SwaggerManager(loggerWrapper, processWrapper, this.OpenApiToolsDirectoryPath, this.OpenApiWebApiAssemblyPath, this.OpenApiSwaggerVersion);
9297
var diffCalculator = new DiffCalculator(Path.Combine(this.OpenApiToolsDirectoryPath, "spectral-state"));
9398

9499
var httpClientWrapper = new HttpClientWrapper();

src/Workleap.OpenApi.MSBuild/msbuild/tools/Workleap.OpenApi.MSBuild.targets

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@
5555
<!-- Use TreatWarningsAsErrors property unless it is opt-out with OpenApiTreatWarningsAsErrors, fallback to false if both are unset -->
5656
<OpenApiTreatWarningsAsErrors Condition="'$(OpenApiTreatWarningsAsErrors)' == ''">$(TreatWarningsAsErrors)</OpenApiTreatWarningsAsErrors>
5757
<OpenApiTreatWarningsAsErrors Condition="'$(OpenApiTreatWarningsAsErrors)' == ''">false</OpenApiTreatWarningsAsErrors>
58+
59+
<!-- The version of Swashbuckle.AspNetCore.Cli to use for generating OpenAPI specs -->
60+
<!-- Fallback chain: explicit property -> PackageVersion (CPM) -> PackageReference -> default -->
61+
<OpenApiSwaggerVersion Condition="'$(OpenApiSwaggerVersion)' == ''">@(PackageVersion->WithMetadataValue('Identity', 'Swashbuckle.AspNetCore')->Metadata('Version'))</OpenApiSwaggerVersion>
62+
<OpenApiSwaggerVersion Condition="'$(OpenApiSwaggerVersion)' == ''">@(PackageReference->WithMetadataValue('Identity', 'Swashbuckle.AspNetCore')->Metadata('Version'))</OpenApiSwaggerVersion>
63+
<OpenApiSwaggerVersion Condition="'$(OpenApiSwaggerVersion)' == ''">10.1.0</OpenApiSwaggerVersion>
5864
</PropertyGroup>
5965

6066
<ItemGroup>
@@ -83,6 +89,7 @@
8389
OpenApiSpecificationFiles="$(OpenApiSpecificationFiles)"
8490
OpenApiTreatWarningsAsErrors="$(OpenApiTreatWarningsAsErrors)"
8591
OpenApiServiceProfile="$(OpenApiServiceProfile)"
92+
OpenApiSwaggerVersion="$(OpenApiSwaggerVersion)"
8693
/>
8794
<Touch Files="$(IntermediateOutputPath)$(OpenApiTouchFileName)" AlwaysCreate="true" />
8895
</Target>

src/tests/WebApi.MsBuild.SystemTest.GenericTest/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Microsoft.OpenApi.Models;
1+
using Microsoft.OpenApi;
22

33
var builder = WebApplication.CreateBuilder(args);
44

src/tests/WebApi.MsBuild.SystemTest.GenericTest/WebApi.MsBuild.SystemTest.GenericTest.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@
1616
</PropertyGroup>
1717

1818
<ItemGroup>
19-
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6" />
19+
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.0" />
2020
</ItemGroup>
2121
</Project>

src/tests/WebApi.MsBuild.SystemTest.GenericTest/openapi-v1-management.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# DO NOT EDIT. This is a generated file
12
openapi: 3.0.4
23
info:
34
title: V1 API management
@@ -10,7 +11,7 @@ paths:
1011
operationId: GetWeatherSources
1112
responses:
1213
'200':
13-
description: Success
14+
description: OK
1415
content:
1516
application/json:
1617
schema:
@@ -53,4 +54,6 @@ components:
5354
source:
5455
type: string
5556
nullable: true
56-
additionalProperties: false
57+
additionalProperties: false
58+
tags:
59+
- name: WeatherManagement

src/tests/WebApi.MsBuild.SystemTest.GenericTest/openapi-v1.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# DO NOT EDIT. This is a generated file
12
openapi: 3.0.4
23
info:
34
title: V1 API General
@@ -10,7 +11,7 @@ paths:
1011
operationId: GetWeatherForecast
1112
responses:
1213
'200':
13-
description: Success
14+
description: OK
1415
content:
1516
application/json:
1617
schema:
@@ -61,4 +62,6 @@ components:
6162
summary:
6263
type: string
6364
nullable: true
64-
additionalProperties: false
65+
additionalProperties: false
66+
tags:
67+
- name: WeatherForecast

0 commit comments

Comments
 (0)