diff --git a/global.json b/global.json
new file mode 100644
index 0000000000..faa4e68e33
--- /dev/null
+++ b/global.json
@@ -0,0 +1,9 @@
+{
+ "sdk": {
+ "version": "8.0.400",
+ "rollForward": "latestFeature"
+ },
+ "msbuild-sdks": {
+ "Microsoft.Build.NoTargets": "3.7.56"
+ }
+ }
\ No newline at end of file
diff --git a/src/Custom.Build.props b/src/Custom.Build.props
index 40d20f3db2..aedf09da4e 100644
--- a/src/Custom.Build.props
+++ b/src/Custom.Build.props
@@ -11,7 +11,6 @@
0.9.0
true
- all
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 7e3a698c3f..4b7369cc5e 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -7,10 +7,10 @@
true
5.0
true
-
low
+ all
- 2.1.2
+ 2.1.3
0024000004800000940000000602000000240000525341310004000001000100dde965e6172e019ac82c2639ffe494dd2e7dd16347c34762a05732b492e110f2e4e2e1b5ef2d85c848ccfb671ee20a47c8d1376276708dc30a90ff1121b647ba3b7259a6bc383b2034938ef0e275b58b920375ac605076178123693c6c4f1331661a62eba28c249386855637780e3ff5f23a6d854700eaa6803ef48907513b92
00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index d47a6af61e..98966408a6 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -1,7 +1,5 @@
-
- all
-
+
diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index 110f4e41c0..fd8b459434 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -7,7 +7,7 @@
-
+
@@ -20,18 +20,18 @@
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
+
+
+
@@ -50,7 +50,7 @@
-
+
@@ -70,25 +70,23 @@
-
+
-
-
+
+
-
-
-
+
-
-
+
+
\ No newline at end of file
diff --git a/src/Particular.LicensingComponent.Persistence.InMemory/Particular.LicensingComponent.Persistence.InMemory.csproj b/src/Particular.LicensingComponent.Persistence.InMemory/Particular.LicensingComponent.Persistence.InMemory.csproj
index 72b8bb90cc..58fa65af4b 100644
--- a/src/Particular.LicensingComponent.Persistence.InMemory/Particular.LicensingComponent.Persistence.InMemory.csproj
+++ b/src/Particular.LicensingComponent.Persistence.InMemory/Particular.LicensingComponent.Persistence.InMemory.csproj
@@ -10,7 +10,7 @@
-
+
\ No newline at end of file
diff --git a/src/ServiceControl.DomainEvents/ServiceControl.DomainEvents.csproj b/src/ServiceControl.DomainEvents/ServiceControl.DomainEvents.csproj
index 2272f41a7e..8b8037bc48 100644
--- a/src/ServiceControl.DomainEvents/ServiceControl.DomainEvents.csproj
+++ b/src/ServiceControl.DomainEvents/ServiceControl.DomainEvents.csproj
@@ -5,7 +5,7 @@
-
+
diff --git a/src/global.json b/src/global.json
deleted file mode 100644
index 2c980ccfd1..0000000000
--- a/src/global.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "msbuild-sdks": {
- "Microsoft.Build.NoTargets": "3.7.56"
- }
-}
\ No newline at end of file
diff --git a/src/msbuild/AutomaticVersionRanges.targets b/src/msbuild/AutomaticVersionRanges.targets
new file mode 100644
index 0000000000..9737210327
--- /dev/null
+++ b/src/msbuild/AutomaticVersionRanges.targets
@@ -0,0 +1,42 @@
+
+
+
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+ @(_ProjectReferencesWithVersions->Count())
+
+
+
+
+
+ <_ProjectReferencesWithVersions Remove="@(_ProjectReferencesWithVersions)" />
+ <_ProjectReferencesWithVersions Include="@(_ProjectReferencesWithVersionRanges)" />
+
+
+
+
+
+ @(PackageReference->Count())
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/msbuild/ConvertToVersionRange.cs b/src/msbuild/ConvertToVersionRange.cs
new file mode 100644
index 0000000000..d918478458
--- /dev/null
+++ b/src/msbuild/ConvertToVersionRange.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Text.RegularExpressions;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+
+public class ConvertToVersionRange : Task
+{
+ [Required]
+ public ITaskItem[] References { get; set; } = [];
+
+ [Required]
+ public string VersionProperty { get; set; } = string.Empty;
+
+ [Output]
+ public ITaskItem[] ReferencesWithVersionRanges { get; private set; } = [];
+
+ public override bool Execute()
+ {
+ var success = true;
+
+ foreach (var reference in References)
+ {
+ var automaticVersionRange = reference.GetMetadata("AutomaticVersionRange");
+
+ if (automaticVersionRange.Equals("false", StringComparison.OrdinalIgnoreCase))
+ {
+ continue;
+ }
+
+ var privateAssets = reference.GetMetadata("PrivateAssets");
+
+ if (privateAssets.Equals("All", StringComparison.OrdinalIgnoreCase))
+ {
+ continue;
+ }
+
+ var version = reference.GetMetadata(VersionProperty);
+ var match = Regex.Match(version, @"^\d+");
+
+ if (match.Value.Equals(string.Empty, StringComparison.Ordinal))
+ {
+ Log.LogError("Reference '{0}' with version '{1}' is not valid for automatic version range conversion. Fix the version or exclude the reference from conversion by setting 'AutomaticVersionRange=\"false\"' on the reference.", reference.ItemSpec, version);
+ success = false;
+ continue;
+ }
+
+ var nextMajor = Convert.ToInt32(match.Value) + 1;
+
+ var versionRange = $"[{version}, {nextMajor}.0.0)";
+ reference.SetMetadata(VersionProperty, versionRange);
+ }
+
+ ReferencesWithVersionRanges = References;
+
+ return success;
+ }
+}