diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 7e3a698..4b7369c 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 d47a6af..9896640 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -1,7 +1,5 @@
-
- all
-
+
diff --git a/src/msbuild/AutomaticVersionRanges.targets b/src/msbuild/AutomaticVersionRanges.targets
new file mode 100644
index 0000000..9737210
--- /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 0000000..d918478
--- /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;
+ }
+}