Skip to content

Commit 8ab6152

Browse files
committed
initial commit
1 parent 1de9d95 commit 8ab6152

File tree

95 files changed

+6085
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+6085
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,3 +348,6 @@ MigrationBackup/
348348

349349
# Ionide (cross platform F# VS Code tools) working folder
350350
.ionide/
351+
352+
353+
.DS_Store

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "components/aspnet-api-versioning"]
2+
path = components/aspnet-api-versioning
3+
url = https://github.com/microsoft/aspnet-api-versioning.git

README.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# ASP.NET API Group Versioning
2+
3+
ASP.NET API Group Versioning adds group versioning functionality to ASP.NET API Versioning. It allows API users to request only with group version. It also allows you to increment endpoint versions only when the feature changes.
4+
5+
## The problem to solve
6+
7+
When we have a web API and are versioning the entire API in each version, we need to bump up version number even when releasing changes only for a few endpoints while all the others are the same. Let's say you provide an API with Endpoint A and B and the current API version is 1.0. When releasing a change in the response data of Endpoint B, you need to increment the API version to 1.1. In this case, the Endpoint A in version 1.0 and the one in version 1.1 are the same, but we still need to add a certain amount of code for it for the sake of versioning. Although the amount depends on how you implement and organize source code in terms of the versioning.
8+
9+
If that kind of code became such amount that is painful from the maintenance point of view, it would turn you off to have small releases. If big bang releases do not bother you, it won't problem you, although possibly problems your API users. If you are in agile development, I'm sure it is a problem.
10+
11+
## This solution
12+
13+
API Group Versioning allows you to have group versions as API version, and to use major-minor versions for each endpoint. In this way, Endpoint A, in the previous example, does not need to have version 1.1.
14+
15+
The following diagram describes how we can version API and endpoints. The lanes represent endpoint version each, and group version 2019-11-02 represents Endpoint A v1.1, Endpoint B v1.1, and Endpoint C v1.0. When you release Endpoint A v1.2, you release API v2020-02-14, which also represents Endpoint B v1.1 and Endpoint C v1.0.
16+
17+
API users can send a request to an endpoint with a group version. API Group Versioning will route the request to the action versioned with the corresponding major-minor version. For example, the request to Endpoint A with API version 2020-02-14 is routed to Endpoint A v1.2, while the request to Endpoint B with the same API version goes to Endpoint B v1.1.
18+
19+
![Group Version](./doc/images/group_versioning.png)
20+
21+
## Code Sample
22+
23+
The code below is a code sample of the controllers with the API Group Versioning, which versioning is equivalent to Endpoint B in the previous example.
24+
25+
```
26+
[ApiController]
27+
[ApiVersion("2019-05-03.1.0")]
28+
[ApiVersion("2019-09-22.1.1")]
29+
[Route("api/v{version:apiVersion}/endpoint-b")]
30+
public class EndpointBV1Controller : ControllerBase
31+
{
32+
[HttpGet]
33+
[MapToApiVersion("2019-05-03.1.0")]
34+
public string GetV1()
35+
{
36+
return $"Received a requrest to Endpoint B v1.0";
37+
}
38+
39+
[HttpGet]
40+
[MapToApiVersion("2019-09-22.1.1")]
41+
public string GetV1_1()
42+
{
43+
return $"Received a requrest to Endpoint B v1.1";
44+
}
45+
}
46+
47+
[ApiController]
48+
[ApiVersion("2020-06-07.2.0")]
49+
[Route("api/v{version:apiVersion}/endpoint-b")]
50+
public class EndpointBV2Controller : ControllerBase
51+
{
52+
[HttpGet]
53+
public string GetV2()
54+
{
55+
return $"Received a requrest to Endpoint B v2.0";
56+
}
57+
}
58+
```
59+
60+
## Set-up
61+
62+
To use ApiGroupVersioning in your ASP.NET Core application, add `Ycode.AspNetCore.Mvc.GroupVersioning` NuGet package to your project, and call `AddApiGroupVersioning` extension method inside the call to 'ConfigureServices(...)' in the application start-up code, as well as depending functionalities.
63+
64+
The following code shows the minimum code required in the application start-up code.
65+
66+
```
67+
public class Startup
68+
{
69+
public void ConfigureServices(IServiceCollection services)
70+
{
71+
services.AddControllers();
72+
services.AddApiVersioning(options => { });
73+
services.AddApiGroupVersioning(options => { });
74+
}
75+
76+
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
77+
{
78+
app.UseRouting();
79+
app.UseEndpoints(endpoints =>
80+
{
81+
endpoints.MapControllerRoute(
82+
name: "default",
83+
pattern: "{controller}/{action=Index}/{id?}");
84+
});
85+
}
86+
}
87+
```
88+
89+
## Design notes
90+
91+
### Versioning formats
92+
93+
ASP.NET API Group Versioning validates versions based on the definition in [Microsoft REST API Guidelines - 12 Versioning](https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#12-versioning)
94+
95+
### Invalid versioning
96+
97+
The guideline document contains a versioning pattern that the same *group version* is associated with multiple *major.minor versions* over the same endpoint. However, note that ASP.NET API Group Versioning will never support it. Such pattern was previously discussed in [GitHub microsoft/aspnet-api-versioning](https://github.com/microsoft/aspnet-api-versioning/issues/334), and ASP.NET API Group Versioning takes the same stance as @commonsensesoftware explained there.

aspnet-api-group-versioning.sln

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio 15
4+
VisualStudioVersion = 15.0.26124.0
5+
MinimumVisualStudioVersion = 15.0.26124.0
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{03C49580-28D1-4A87-987E-84780BDEBFAE}"
7+
EndProject
8+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{078D6935-9F19-4DEB-87DB-A55E0ABA0E63}"
9+
EndProject
10+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{AA3205AF-D2BB-4007-A891-485B92E1CA74}"
11+
EndProject
12+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample1", "test\samples\Sample1\Sample1.csproj", "{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}"
13+
EndProject
14+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample2", "test\samples\Sample2\Sample2.csproj", "{6D720BBA-5910-4480-A436-D40BE36457D6}"
15+
EndProject
16+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components", "components", "{DD64E099-B1E1-4517-A42A-D744DEFA54DE}"
17+
EndProject
18+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnet-api-versioning", "aspnet-api-versioning", "{7A203DF3-7974-42FB-8200-80A09CEB5451}"
19+
EndProject
20+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{6A81A364-4268-4953-9EDA-65F3DFAD1615}"
21+
EndProject
22+
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Common", "components\aspnet-api-versioning\src\Common\Common.shproj", "{6D0E834B-6422-44CD-9A85-E3BE9DEAD1BE}"
23+
EndProject
24+
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Shared", "components\aspnet-api-versioning\src\Shared\Shared.shproj", "{B7897873-6757-4684-83C0-39575821AE14}"
25+
EndProject
26+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample3", "test\samples\Sample3\Sample3.csproj", "{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}"
27+
EndProject
28+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleCommon", "test\samples\SampleCommon\SampleCommon.csproj", "{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}"
29+
EndProject
30+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample4", "test\samples\Sample4\Sample4.csproj", "{383AF40E-6CA2-46B3-8E61-A6798ED88800}"
31+
EndProject
32+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample5", "test\samples\Sample5\Sample5.csproj", "{09E139A1-12A0-49F6-9322-88B2F939757E}"
33+
EndProject
34+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Mvc.Versioning", "components\aspnet-api-versioning\src\Microsoft.AspNetCore.Mvc.Versioning\Microsoft.AspNetCore.Mvc.Versioning.csproj", "{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}"
35+
EndProject
36+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCore.Mvc.GroupVersioning", "src\AspNetCore.Mvc.GroupVersioning\AspNetCore.Mvc.GroupVersioning.csproj", "{99FC23AF-9EE9-43BE-AA51-A79C932452D0}"
37+
EndProject
38+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCore.Mvc.GroupVersioning.Test", "test\AspNetCore.Mvc.GroupVersioning.Test\AspNetCore.Mvc.GroupVersioning.Test.csproj", "{93D498E7-762D-4C08-991A-3658E63AB981}"
39+
EndProject
40+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{1A55F1D7-4F0B-41A5-A9A8-8CF5DF6BBCCB}"
41+
ProjectSection(SolutionItems) = preProject
42+
README.md = README.md
43+
EndProjectSection
44+
EndProject
45+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeSample", "test\samples\CodeSample\CodeSample.csproj", "{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}"
46+
EndProject
47+
Global
48+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
49+
Debug|Any CPU = Debug|Any CPU
50+
Debug|x64 = Debug|x64
51+
Debug|x86 = Debug|x86
52+
Release|Any CPU = Release|Any CPU
53+
Release|x64 = Release|x64
54+
Release|x86 = Release|x86
55+
EndGlobalSection
56+
GlobalSection(SolutionProperties) = preSolution
57+
HideSolutionNode = FALSE
58+
EndGlobalSection
59+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
60+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
61+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
62+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Debug|x64.ActiveCfg = Debug|Any CPU
63+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Debug|x64.Build.0 = Debug|Any CPU
64+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Debug|x86.ActiveCfg = Debug|Any CPU
65+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Debug|x86.Build.0 = Debug|Any CPU
66+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
67+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Release|Any CPU.Build.0 = Release|Any CPU
68+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Release|x64.ActiveCfg = Release|Any CPU
69+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Release|x64.Build.0 = Release|Any CPU
70+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Release|x86.ActiveCfg = Release|Any CPU
71+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD}.Release|x86.Build.0 = Release|Any CPU
72+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
73+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
74+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Debug|x64.ActiveCfg = Debug|Any CPU
75+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Debug|x64.Build.0 = Debug|Any CPU
76+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Debug|x86.ActiveCfg = Debug|Any CPU
77+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Debug|x86.Build.0 = Debug|Any CPU
78+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
79+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Release|Any CPU.Build.0 = Release|Any CPU
80+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Release|x64.ActiveCfg = Release|Any CPU
81+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Release|x64.Build.0 = Release|Any CPU
82+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Release|x86.ActiveCfg = Release|Any CPU
83+
{6D720BBA-5910-4480-A436-D40BE36457D6}.Release|x86.Build.0 = Release|Any CPU
84+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
85+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
86+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Debug|x64.ActiveCfg = Debug|Any CPU
87+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Debug|x64.Build.0 = Debug|Any CPU
88+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Debug|x86.ActiveCfg = Debug|Any CPU
89+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Debug|x86.Build.0 = Debug|Any CPU
90+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
91+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Release|Any CPU.Build.0 = Release|Any CPU
92+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Release|x64.ActiveCfg = Release|Any CPU
93+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Release|x64.Build.0 = Release|Any CPU
94+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Release|x86.ActiveCfg = Release|Any CPU
95+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B}.Release|x86.Build.0 = Release|Any CPU
96+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
97+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Debug|Any CPU.Build.0 = Debug|Any CPU
98+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Debug|x64.ActiveCfg = Debug|Any CPU
99+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Debug|x64.Build.0 = Debug|Any CPU
100+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Debug|x86.ActiveCfg = Debug|Any CPU
101+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Debug|x86.Build.0 = Debug|Any CPU
102+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Release|Any CPU.ActiveCfg = Release|Any CPU
103+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Release|Any CPU.Build.0 = Release|Any CPU
104+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Release|x64.ActiveCfg = Release|Any CPU
105+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Release|x64.Build.0 = Release|Any CPU
106+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Release|x86.ActiveCfg = Release|Any CPU
107+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77}.Release|x86.Build.0 = Release|Any CPU
108+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
109+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Debug|Any CPU.Build.0 = Debug|Any CPU
110+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Debug|x64.ActiveCfg = Debug|Any CPU
111+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Debug|x64.Build.0 = Debug|Any CPU
112+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Debug|x86.ActiveCfg = Debug|Any CPU
113+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Debug|x86.Build.0 = Debug|Any CPU
114+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Release|Any CPU.ActiveCfg = Release|Any CPU
115+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Release|Any CPU.Build.0 = Release|Any CPU
116+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Release|x64.ActiveCfg = Release|Any CPU
117+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Release|x64.Build.0 = Release|Any CPU
118+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Release|x86.ActiveCfg = Release|Any CPU
119+
{383AF40E-6CA2-46B3-8E61-A6798ED88800}.Release|x86.Build.0 = Release|Any CPU
120+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
121+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Debug|Any CPU.Build.0 = Debug|Any CPU
122+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Debug|x64.ActiveCfg = Debug|Any CPU
123+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Debug|x64.Build.0 = Debug|Any CPU
124+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Debug|x86.ActiveCfg = Debug|Any CPU
125+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Debug|x86.Build.0 = Debug|Any CPU
126+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Release|Any CPU.ActiveCfg = Release|Any CPU
127+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Release|Any CPU.Build.0 = Release|Any CPU
128+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Release|x64.ActiveCfg = Release|Any CPU
129+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Release|x64.Build.0 = Release|Any CPU
130+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Release|x86.ActiveCfg = Release|Any CPU
131+
{09E139A1-12A0-49F6-9322-88B2F939757E}.Release|x86.Build.0 = Release|Any CPU
132+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
133+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Debug|Any CPU.Build.0 = Debug|Any CPU
134+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Debug|x64.ActiveCfg = Debug|Any CPU
135+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Debug|x64.Build.0 = Debug|Any CPU
136+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Debug|x86.ActiveCfg = Debug|Any CPU
137+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Debug|x86.Build.0 = Debug|Any CPU
138+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Release|Any CPU.ActiveCfg = Release|Any CPU
139+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Release|Any CPU.Build.0 = Release|Any CPU
140+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Release|x64.ActiveCfg = Release|Any CPU
141+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Release|x64.Build.0 = Release|Any CPU
142+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Release|x86.ActiveCfg = Release|Any CPU
143+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D}.Release|x86.Build.0 = Release|Any CPU
144+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
145+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
146+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Debug|x64.ActiveCfg = Debug|Any CPU
147+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Debug|x64.Build.0 = Debug|Any CPU
148+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Debug|x86.ActiveCfg = Debug|Any CPU
149+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Debug|x86.Build.0 = Debug|Any CPU
150+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
151+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Release|Any CPU.Build.0 = Release|Any CPU
152+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Release|x64.ActiveCfg = Release|Any CPU
153+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Release|x64.Build.0 = Release|Any CPU
154+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Release|x86.ActiveCfg = Release|Any CPU
155+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0}.Release|x86.Build.0 = Release|Any CPU
156+
{93D498E7-762D-4C08-991A-3658E63AB981}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
157+
{93D498E7-762D-4C08-991A-3658E63AB981}.Debug|Any CPU.Build.0 = Debug|Any CPU
158+
{93D498E7-762D-4C08-991A-3658E63AB981}.Debug|x64.ActiveCfg = Debug|Any CPU
159+
{93D498E7-762D-4C08-991A-3658E63AB981}.Debug|x64.Build.0 = Debug|Any CPU
160+
{93D498E7-762D-4C08-991A-3658E63AB981}.Debug|x86.ActiveCfg = Debug|Any CPU
161+
{93D498E7-762D-4C08-991A-3658E63AB981}.Debug|x86.Build.0 = Debug|Any CPU
162+
{93D498E7-762D-4C08-991A-3658E63AB981}.Release|Any CPU.ActiveCfg = Release|Any CPU
163+
{93D498E7-762D-4C08-991A-3658E63AB981}.Release|Any CPU.Build.0 = Release|Any CPU
164+
{93D498E7-762D-4C08-991A-3658E63AB981}.Release|x64.ActiveCfg = Release|Any CPU
165+
{93D498E7-762D-4C08-991A-3658E63AB981}.Release|x64.Build.0 = Release|Any CPU
166+
{93D498E7-762D-4C08-991A-3658E63AB981}.Release|x86.ActiveCfg = Release|Any CPU
167+
{93D498E7-762D-4C08-991A-3658E63AB981}.Release|x86.Build.0 = Release|Any CPU
168+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
169+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Debug|Any CPU.Build.0 = Debug|Any CPU
170+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Debug|x64.ActiveCfg = Debug|Any CPU
171+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Debug|x64.Build.0 = Debug|Any CPU
172+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Debug|x86.ActiveCfg = Debug|Any CPU
173+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Debug|x86.Build.0 = Debug|Any CPU
174+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Release|Any CPU.ActiveCfg = Release|Any CPU
175+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Release|Any CPU.Build.0 = Release|Any CPU
176+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Release|x64.ActiveCfg = Release|Any CPU
177+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Release|x64.Build.0 = Release|Any CPU
178+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Release|x86.ActiveCfg = Release|Any CPU
179+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447}.Release|x86.Build.0 = Release|Any CPU
180+
EndGlobalSection
181+
GlobalSection(NestedProjects) = preSolution
182+
{AA3205AF-D2BB-4007-A891-485B92E1CA74} = {078D6935-9F19-4DEB-87DB-A55E0ABA0E63}
183+
{AC588B4D-FFE3-4CF7-B279-8A0BEECBABDD} = {AA3205AF-D2BB-4007-A891-485B92E1CA74}
184+
{6D720BBA-5910-4480-A436-D40BE36457D6} = {AA3205AF-D2BB-4007-A891-485B92E1CA74}
185+
{7A203DF3-7974-42FB-8200-80A09CEB5451} = {DD64E099-B1E1-4517-A42A-D744DEFA54DE}
186+
{6A81A364-4268-4953-9EDA-65F3DFAD1615} = {7A203DF3-7974-42FB-8200-80A09CEB5451}
187+
{6D0E834B-6422-44CD-9A85-E3BE9DEAD1BE} = {6A81A364-4268-4953-9EDA-65F3DFAD1615}
188+
{B7897873-6757-4684-83C0-39575821AE14} = {6A81A364-4268-4953-9EDA-65F3DFAD1615}
189+
{A9E4F0BD-E68D-4DBA-8FE4-F200A222FF2B} = {AA3205AF-D2BB-4007-A891-485B92E1CA74}
190+
{75A9995A-D510-49F3-BFB4-4AAACE1B5F77} = {AA3205AF-D2BB-4007-A891-485B92E1CA74}
191+
{383AF40E-6CA2-46B3-8E61-A6798ED88800} = {AA3205AF-D2BB-4007-A891-485B92E1CA74}
192+
{09E139A1-12A0-49F6-9322-88B2F939757E} = {AA3205AF-D2BB-4007-A891-485B92E1CA74}
193+
{83F0DC18-5BBD-4E50-ABB3-62628BA1E93D} = {6A81A364-4268-4953-9EDA-65F3DFAD1615}
194+
{99FC23AF-9EE9-43BE-AA51-A79C932452D0} = {03C49580-28D1-4A87-987E-84780BDEBFAE}
195+
{93D498E7-762D-4C08-991A-3658E63AB981} = {078D6935-9F19-4DEB-87DB-A55E0ABA0E63}
196+
{D0F1ED6E-11A6-41DB-ADF3-B3BFFF3A9447} = {AA3205AF-D2BB-4007-A891-485B92E1CA74}
197+
EndGlobalSection
198+
EndGlobal

doc/images/group_versioning.png

14.7 KB
Loading

doc/images/icon.png

4.22 KB
Loading

img/icon.kra

538 KB
Binary file not shown.

0 commit comments

Comments
 (0)