From 34efc30a722b64b60b17a561a8b522037a46185d Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Fri, 19 Jun 2026 16:10:24 -0700 Subject: [PATCH] Support for more sections of global.json --- .../GlobalJsonTests.cs | 106 +++++++++ .../GlobalJsonCreator.cs | 225 +++++++++++++++--- .../GlobalJsonSdkRollForward.cs | 61 ++++- .../PublicAPI/net10.0/PublicAPI.Unshipped.txt | 19 +- .../PublicAPI/net472/PublicAPI.Unshipped.txt | 19 +- .../PublicAPI/net8.0/PublicAPI.Unshipped.txt | 19 +- .../Strings.Designer.cs | 11 +- .../Strings.resx | 3 + 8 files changed, 407 insertions(+), 56 deletions(-) diff --git a/src/Microsoft.Build.Utilities.ProjectCreation.UnitTests/GlobalJsonTests.cs b/src/Microsoft.Build.Utilities.ProjectCreation.UnitTests/GlobalJsonTests.cs index 260568d..64fed29 100644 --- a/src/Microsoft.Build.Utilities.ProjectCreation.UnitTests/GlobalJsonTests.cs +++ b/src/Microsoft.Build.Utilities.ProjectCreation.UnitTests/GlobalJsonTests.cs @@ -3,6 +3,7 @@ // Licensed under the MIT license. using Shouldly; +using System; using System.IO; using Xunit; @@ -23,6 +24,8 @@ public void BasicGlobalJson() GlobalJsonCreator globalJson = GlobalJsonCreator.Create(TestDirectory, "8.0.100") .Save(); + globalJson.FullPath.ShouldNotBeNull(); + new FileInfo(globalJson.FullPath).ShouldExist(); string json = File.ReadAllText(globalJson.FullPath); @@ -36,6 +39,28 @@ public void BasicGlobalJson() StringCompareShould.IgnoreLineEndings); } + [Fact] + public void GlobalJsonCreateWithoutDirectoryCanSaveToDirectoryInfo() + { + GlobalJsonCreator globalJson = GlobalJsonCreator + .Create(sdkVersion: "10.0.100") + .Save(TestDirectory); + + globalJson.FullPath.ShouldBe(Path.Combine(TestDirectory.FullName, "global.json")); + new FileInfo(globalJson.FullPath!).ShouldExist(); + } + + [Fact] + public void GlobalJsonCreateWithoutDirectoryCanSaveToStringPath() + { + GlobalJsonCreator globalJson = GlobalJsonCreator + .Create(sdkVersion: "10.0.100") + .Save(TestDirectory.FullName); + + globalJson.FullPath.ShouldBe(Path.Combine(TestDirectory.FullName, "global.json")); + new FileInfo(globalJson.FullPath!).ShouldExist(); + } + [Fact] public void GlobalJsonImplicitConversionToString() { @@ -51,6 +76,27 @@ public void GlobalJsonImplicitConversionToString() StringCompareShould.IgnoreLineEndings); } + [Fact] + public void GlobalJsonSaveWithoutDirectoryThrows() + { + Should.Throw( + () => GlobalJsonCreator.Create().Save()); + } + + [Fact] + public void GlobalJsonSdkRollForwardEnumValuesAreStable() + { + ((int)GlobalJsonSdkRollForward.LatestPatch).ShouldBe(0); + ((int)GlobalJsonSdkRollForward.LatestFeature).ShouldBe(1); + ((int)GlobalJsonSdkRollForward.LatestMinor).ShouldBe(2); + ((int)GlobalJsonSdkRollForward.LatestMajor).ShouldBe(3); + ((int)GlobalJsonSdkRollForward.Disable).ShouldBe(4); + ((int)GlobalJsonSdkRollForward.Patch).ShouldBe(5); + ((int)GlobalJsonSdkRollForward.Feature).ShouldBe(6); + ((int)GlobalJsonSdkRollForward.Minor).ShouldBe(7); + ((int)GlobalJsonSdkRollForward.Major).ShouldBe(8); + } + [Fact] public void GlobalJsonToJson() { @@ -75,6 +121,8 @@ public void GlobalJsonWithAllowPrerelease() .Create(TestDirectory, "8.0.100", allowPrerelease: true) .Save(); + globalJson.FullPath.ShouldNotBeNull(); + new FileInfo(globalJson.FullPath).ShouldExist(); string json = File.ReadAllText(globalJson.FullPath); @@ -98,6 +146,8 @@ public void GlobalJsonWithMsbuildSdks() .MSBuildSdk("Microsoft.Build.Traversal", "4.1.0") .Save(); + globalJson.FullPath.ShouldNotBeNull(); + new FileInfo(globalJson.FullPath).ShouldExist(); string json = File.ReadAllText(globalJson.FullPath); @@ -122,6 +172,8 @@ public void GlobalJsonWithRollForward() .Create(TestDirectory, "10.0.100", GlobalJsonSdkRollForward.LatestMinor) .Save(); + globalJson.FullPath.ShouldNotBeNull(); + new FileInfo(globalJson.FullPath).ShouldExist(); string json = File.ReadAllText(globalJson.FullPath); @@ -133,6 +185,60 @@ public void GlobalJsonWithRollForward() ""rollForward"": ""latestMinor"" } }", +StringCompareShould.IgnoreLineEndings); + } + + [Theory] + [InlineData(GlobalJsonSdkRollForward.Patch, "patch")] + [InlineData(GlobalJsonSdkRollForward.Feature, "feature")] + [InlineData(GlobalJsonSdkRollForward.Minor, "minor")] + [InlineData(GlobalJsonSdkRollForward.Major, "major")] + [InlineData(GlobalJsonSdkRollForward.LatestPatch, "latestPatch")] + [InlineData(GlobalJsonSdkRollForward.LatestFeature, "latestFeature")] + [InlineData(GlobalJsonSdkRollForward.LatestMinor, "latestMinor")] + [InlineData(GlobalJsonSdkRollForward.LatestMajor, "latestMajor")] + [InlineData(GlobalJsonSdkRollForward.Disable, "disable")] + public void GlobalJsonWithRollForwardValues(GlobalJsonSdkRollForward rollForward, string expectedRollForwardValue) + { + string json = GlobalJsonCreator + .Create(TestDirectory, "10.0.100", rollForward) + .ToJson(); + + json.ShouldBe( +$@"{{ + ""sdk"": {{ + ""version"": ""10.0.100"", + ""rollForward"": ""{expectedRollForwardValue}"" + }} +}}", +StringCompareShould.IgnoreLineEndings); + } + + [Fact] + public void GlobalJsonWithSdkErrorMessagePathsAndTestRunner() + { + string json = GlobalJsonCreator + .Create(sdkVersion: "10.0.100") + .SdkErrorMessage("Install .NET SDK 10.0.100") + .SdkPath("$host$") + .SdkPath(".dotnet") + .TestRunner("vstest") + .ToJson(); + + json.ShouldBe( +@"{ + ""sdk"": { + ""version"": ""10.0.100"", + ""paths"": [ + ""$host$"", + "".dotnet"" + ], + ""errorMessage"": ""Install .NET SDK 10.0.100"" + }, + ""test"": { + ""runner"": ""vstest"" + } +}", StringCompareShould.IgnoreLineEndings); } } diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/GlobalJsonCreator.cs b/src/Microsoft.Build.Utilities.ProjectCreation/GlobalJsonCreator.cs index da7602c..12a02cd 100644 --- a/src/Microsoft.Build.Utilities.ProjectCreation/GlobalJsonCreator.cs +++ b/src/Microsoft.Build.Utilities.ProjectCreation/GlobalJsonCreator.cs @@ -2,9 +2,11 @@ // // Licensed under the MIT license. +using Microsoft.Build.Framework; using System; using System.Collections.Generic; using System.IO; +using System.Security.Cryptography; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; @@ -16,31 +18,24 @@ namespace Microsoft.Build.Utilities.ProjectCreation /// public partial class GlobalJsonCreator { - private readonly GlobalJson _globalJson; - - private readonly JsonSerializerOptions _jsonSerializerOptions = new() + private static readonly JsonSerializerOptions JsonSerializerOptions = new() { WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, PropertyNamingPolicy = JsonNamingPolicy.CamelCase, }; - private GlobalJsonCreator(FileInfo fullPath, string sdkVersion, GlobalJsonSdkRollForward? rollForward, bool? allowPrerelease) + private FileInfo? _fullPath = null; + private GlobalJson _globalJson = new(); + + private GlobalJsonCreator() { - _globalJson = new GlobalJson( - fullPath, - new GlobalJsonSdk - { - Version = sdkVersion, - RollForward = rollForward, - AllowPrerelease = allowPrerelease, - }); } /// /// Gets the full path to the global.json file. /// - public string FullPath => _globalJson.FullPath.FullName; + public string? FullPath => _fullPath?.FullName; /// /// Implicitly converts a to a string. @@ -48,6 +43,15 @@ private GlobalJsonCreator(FileInfo fullPath, string sdkVersion, GlobalJsonSdkRol /// The to convert. public static implicit operator string(GlobalJsonCreator creator) => creator.ToJson(); + /// + /// Creates a new instance. + /// + /// A object used to construct a global.json file. + public static GlobalJsonCreator Create() + { + return new GlobalJsonCreator(); + } + /// /// Creates a new instance. /// @@ -57,19 +61,24 @@ private GlobalJsonCreator(FileInfo fullPath, string sdkVersion, GlobalJsonSdkRol /// Whether to allow prerelease SDK versions. /// A object used to construct a global.json file. public static GlobalJsonCreator Create( - DirectoryInfo directory, - string sdkVersion, + DirectoryInfo? directory = null, + string? sdkVersion = null, GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) { - if (string.IsNullOrWhiteSpace(sdkVersion)) + GlobalJsonCreator globalJsonCreator = new GlobalJsonCreator() + .SdkVersion(sdkVersion) + .SdkRollForward(rollForward) + .SdkAllowPrerelease(allowPrerelease); + + if (directory != null) { - throw new ArgumentNullException(nameof(sdkVersion)); - } + FileInfo fullPath = new(Path.Combine(directory.FullName, "global.json")); - FileInfo fullPath = new(Path.GetFullPath(Path.Combine(directory.FullName, "global.json"))); + globalJsonCreator._fullPath = fullPath; + } - return new GlobalJsonCreator(fullPath, sdkVersion, rollForward, allowPrerelease); + return globalJsonCreator; } /// @@ -82,7 +91,7 @@ public static GlobalJsonCreator Create( /// A object used to construct a global.json file. public static GlobalJsonCreator Create( string? directory, - string sdkVersion, + string? sdkVersion, GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) { @@ -125,45 +134,189 @@ public GlobalJsonCreator MSBuildSdk(string name, string version) /// The current . public GlobalJsonCreator Save() { - _globalJson.FullPath.Directory!.Create(); + if (_fullPath is null) + { + throw new InvalidOperationException(Strings.ErrorGlobalJsonDirectoryNotSpecified); + } + + _fullPath.Directory!.Create(); string json = ToJson(); - File.WriteAllText(_globalJson.FullPath.FullName, json, Encoding.UTF8); + File.WriteAllText(_fullPath.FullName, json, Encoding.UTF8); return this; } /// - /// Gets the JSON representation of the global.json file. + /// Saves the global.json file to a specified directory. /// - /// A JSON string representing the global.json file. - public string ToJson() => JsonSerializer.Serialize(_globalJson, _jsonSerializerOptions); + /// The directory to save the global.json file to. + /// The current . + /// If no directory was specified when creating the instance. + public GlobalJsonCreator Save(string directory) + { + if (string.IsNullOrWhiteSpace(directory)) + { + throw new ArgumentNullException(nameof(directory)); + } - internal record GlobalJson + Save(new DirectoryInfo(directory)); + + return this; + } + + /// + /// Saves the global.json file to a specified directory. + /// + /// A representing the directory to save the global.json file to. + /// The current . + public GlobalJsonCreator Save(DirectoryInfo directory) { - public GlobalJson(FileInfo fullPath, GlobalJsonSdk sdk) + if (directory is null) { - FullPath = fullPath; - Sdk = sdk; + throw new ArgumentNullException(nameof(directory)); } - [JsonIgnore] - public FileInfo FullPath { get; init; } + _fullPath = new FileInfo(Path.Combine(directory.FullName, "global.json")); + + Save(); + + return this; + } + + /// + /// Sets whether to allow prerelease SDK versions. + /// + /// A value indicating whether to allow prerelease SDK versions. + /// The current . + public GlobalJsonCreator SdkAllowPrerelease(bool? allowPrerelease) + { + _globalJson.Sdk ??= new GlobalJsonSdk(); + + _globalJson.Sdk.AllowPrerelease = allowPrerelease; + + return this; + } + + /// + /// Sets a custom error message displayed when the SDK resolver can't find a compatible .NET SDK. + /// + /// A custom error message displayed when the SDK resolver can't find a compatible .NET SDK. + /// The current . + public GlobalJsonCreator SdkErrorMessage(string? message) + { + _globalJson.Sdk ??= new GlobalJsonSdk(); + + _globalJson.Sdk.ErrorMessage = message; + + return this; + } + + /// + /// Adds a location that should be considered when searching for a compatible .NET SDK. + /// + /// The location that should be considered when searching for a compatible .NET SDK. Paths can be absolute or relative to the location of the global.json file. The special value $host$ represents the location corresponding to the running dotnet executable. + /// These paths are searched in the order they're defined and the first matching SDK is used. + /// This feature enables using local SDK installations (such as SDKs relative to a repository root or placed in a custom folder) that aren't installed globally on the system. + /// + /// + /// The "paths" feature only works when using commands that engage the.NET SDK, such as dotnet run.It does NOT affect scenarios such as running the native apphost launcher (app.exe), running with dotnet app.dll, or running with dotnet exec app.dll.To use the "paths" feature, you must use SDK commands like dotnet run. + /// + /// The current . + public GlobalJsonCreator SdkPath(string path) + { + _globalJson.Sdk ??= new GlobalJsonSdk(); + + _globalJson.Sdk.Paths ??= []; + + _globalJson.Sdk.Paths.Add(path); + + return this; + } + + /// + /// Sets the roll-forward policy to use. + /// + /// The roll-forward policy to use when selecting an SDK version, either as a fallback when a specific SDK version is missing or as a directive to use a later version. A version must be specified with a rollForward value, unless you're setting it to latestMajor. The default roll forward behavior is determined by the matching rules. + /// The current . + public GlobalJsonCreator SdkRollForward(GlobalJsonSdkRollForward? rollForward) + { + _globalJson.Sdk ??= new GlobalJsonSdk(); + + _globalJson.Sdk.RollForward = rollForward; + + return this; + } + + /// + /// Sets the version of the .NET SDK to use. + /// + /// + /// The version of the .NET SDK to use. This field: + /// + /// Requires the full version number, such as 10.0.100. + /// Doesn't support version numbers like 10, 10.0, or 10.0.x. + /// Doesn't have wildcard support. + /// Doesn't support version ranges. + /// + /// + /// The current . + public GlobalJsonCreator SdkVersion(string? sdkVersion) + { + _globalJson.Sdk ??= new GlobalJsonSdk(); - public GlobalJsonSdk Sdk { get; init; } + _globalJson.Sdk.Version = sdkVersion; + + return this; + } + + /// + /// Adds a test runner to discover/run tests with. + /// + /// The name of the test runner. + /// The current . + public GlobalJsonCreator TestRunner(string name) + { + _globalJson.Test ??= new GlobalJsonTest(); + + _globalJson.Test.Runner = name; + + return this; + } + + /// + /// Gets the JSON representation of the global.json file. + /// + /// A JSON string representing the global.json file. + public string ToJson() => JsonSerializer.Serialize(_globalJson, JsonSerializerOptions); + + internal record GlobalJson + { + public GlobalJsonSdk? Sdk { get; set; } [JsonPropertyName("msbuild-sdks")] public Dictionary? MSBuildSdks { get; set; } + + public GlobalJsonTest? Test { get; set; } } internal record GlobalJsonSdk { - public required string Version { get; init; } + public string? Version { get; set; } + + public bool? AllowPrerelease { get; set; } + + public GlobalJsonSdkRollForward? RollForward { get; set; } - public GlobalJsonSdkRollForward? RollForward { get; init; } + public List? Paths { get; set; } - public bool? AllowPrerelease { get; init; } + public string? ErrorMessage { get; set; } + } + + internal record GlobalJsonTest + { + public string? Runner { get; set; } } } } diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/GlobalJsonSdkRollForward.cs b/src/Microsoft.Build.Utilities.ProjectCreation/GlobalJsonSdkRollForward.cs index 7e910c5..26bec29 100644 --- a/src/Microsoft.Build.Utilities.ProjectCreation/GlobalJsonSdkRollForward.cs +++ b/src/Microsoft.Build.Utilities.ProjectCreation/GlobalJsonSdkRollForward.cs @@ -15,32 +15,53 @@ namespace Microsoft.Build.Utilities.ProjectCreation public enum GlobalJsonSdkRollForward { /// - /// Roll forward to the latest patch version. + /// Uses the specified version. If not found, rolls forward to the latest patch level. If not found, fails. This value is the legacy behavior from the earlier versions of the SDK. /// - LatestPatch, + Patch = 5, /// - /// Roll forward to the latest feature version. + /// Uses the latest patch level for the specified major, minor, and feature band. If not found, rolls forward to the next higher feature band within the same major/minor and uses the latest patch level for that feature band. If not found, fails. /// - LatestFeature, + Feature = 6, /// - /// Roll forward to the latest minor version. + /// Uses the latest patch level for the specified major, minor, and feature band. If not found, rolls forward to the next higher feature band within the same major/minor version and uses the latest patch level for that feature band. If not found, rolls forward to the next higher minor and feature band within the same major and uses the latest patch level for that feature band. If not found, fails. /// - LatestMinor, + Minor = 7, /// - /// Roll forward to the latest major version. + /// Uses the latest patch level for the specified major, minor, and feature band. If not found, rolls forward to the next higher feature band within the same major/minor version and uses the latest patch level for that feature band. If not found, rolls forward to the next higher minor and feature band within the same major and uses the latest patch level for that feature band. If not found, rolls forward to the next higher major, minor, and feature band and uses the latest patch level for that feature band. If not found, fails. /// - LatestMajor, + Major = 8, /// - /// Disable roll-forward. + /// Uses the latest installed patch level that matches the requested major, minor, and feature band with a patch level that's greater than or equal to the specified value. If not found, fails. /// - Disable, + LatestPatch = 0, + + /// + /// Uses the highest installed feature band and patch level that matches the requested major and minor with a feature band and patch level that's greater than or equal to the specified value. If not found, fails. + /// + LatestFeature = 1, + + /// + /// Uses the highest installed minor, feature band, and patch level that matches the requested major with a minor, feature band, and patch level that's greater than or equal to the specified value. If not found, fails. + /// + LatestMinor = 2, + + /// + /// Uses the highest installed .NET SDK with a version that's greater than or equal to the specified value. If not found, fail. + /// + LatestMajor = 3, + + /// + /// Doesn't roll forward; an exact match is required. + /// + Disable = 4, } #pragma warning disable SA1649 // File name should match first type name + internal class GlobalJsonSdkRollForwardJsonConverter : JsonConverter #pragma warning restore SA1649 // File name should match first type name { @@ -50,6 +71,10 @@ public override GlobalJsonSdkRollForward Read(ref Utf8JsonReader reader, Type ty return value?.Trim() switch { + "patch" => GlobalJsonSdkRollForward.Patch, + "feature" => GlobalJsonSdkRollForward.Feature, + "minor" => GlobalJsonSdkRollForward.Minor, + "major" => GlobalJsonSdkRollForward.Major, "latestPatch" => GlobalJsonSdkRollForward.LatestPatch, "latestFeature" => GlobalJsonSdkRollForward.LatestFeature, "latestMinor" => GlobalJsonSdkRollForward.LatestMinor, @@ -63,6 +88,22 @@ public override void Write(Utf8JsonWriter writer, GlobalJsonSdkRollForward value { switch (value) { + case GlobalJsonSdkRollForward.Patch: + writer.WriteStringValue("patch"); + break; + + case GlobalJsonSdkRollForward.Feature: + writer.WriteStringValue("feature"); + break; + + case GlobalJsonSdkRollForward.Minor: + writer.WriteStringValue("minor"); + break; + + case GlobalJsonSdkRollForward.Major: + writer.WriteStringValue("major"); + break; + case GlobalJsonSdkRollForward.LatestPatch: writer.WriteStringValue("latestPatch"); break; diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Unshipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Unshipped.txt index 4300428..318dde6 100644 --- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Unshipped.txt @@ -1,19 +1,32 @@ #nullable enable Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator -Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.FullPath.get -> string! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.FullPath.get -> string? Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.MSBuildSdk(string! name, string! version) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save() -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save(string! directory) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save(System.IO.DirectoryInfo! directory) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkAllowPrerelease(bool? allowPrerelease) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkErrorMessage(string? message) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkPath(string! path) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkRollForward(Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkVersion(string? sdkVersion) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.TestRunner(string! name) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.ToJson() -> string! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Disable = 4 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Feature = 6 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestFeature = 1 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestMajor = 3 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestMinor = 2 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestPatch = 0 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Major = 8 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Minor = 7 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Patch = 5 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ItemPackageVersion(Microsoft.Build.Utilities.ProjectCreation.Package! package, System.Collections.Generic.IDictionary? metadata = null, string? condition = null, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ItemPackageVersion(string! include, string! version, System.Collections.Generic.IDictionary? metadata = null, string? condition = null, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.TryBuild(System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreatorTemplates.DirectoryPackagesProps(System.Collections.Generic.IDictionary? packageVersions = null, string? directory = null, System.Action? projectCreator = null, Microsoft.Build.Evaluation.ProjectCollection? projectCollection = null, Microsoft.Build.Evaluation.NewProjectFileOptions? projectFileOptions = Microsoft.Build.Evaluation.NewProjectFileOptions.None, System.Collections.Generic.IDictionary? globalProperties = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! -static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(string? directory, string! sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! -static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(System.IO.DirectoryInfo! directory, string! sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create() -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(string? directory, string? sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(System.IO.DirectoryInfo? directory = null, string? sdkVersion = null, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.implicit operator string!(Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! creator) -> string! diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt index 4300428..318dde6 100644 --- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt @@ -1,19 +1,32 @@ #nullable enable Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator -Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.FullPath.get -> string! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.FullPath.get -> string? Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.MSBuildSdk(string! name, string! version) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save() -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save(string! directory) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save(System.IO.DirectoryInfo! directory) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkAllowPrerelease(bool? allowPrerelease) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkErrorMessage(string? message) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkPath(string! path) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkRollForward(Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkVersion(string? sdkVersion) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.TestRunner(string! name) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.ToJson() -> string! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Disable = 4 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Feature = 6 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestFeature = 1 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestMajor = 3 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestMinor = 2 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestPatch = 0 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Major = 8 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Minor = 7 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Patch = 5 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ItemPackageVersion(Microsoft.Build.Utilities.ProjectCreation.Package! package, System.Collections.Generic.IDictionary? metadata = null, string? condition = null, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ItemPackageVersion(string! include, string! version, System.Collections.Generic.IDictionary? metadata = null, string? condition = null, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.TryBuild(System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreatorTemplates.DirectoryPackagesProps(System.Collections.Generic.IDictionary? packageVersions = null, string? directory = null, System.Action? projectCreator = null, Microsoft.Build.Evaluation.ProjectCollection? projectCollection = null, Microsoft.Build.Evaluation.NewProjectFileOptions? projectFileOptions = Microsoft.Build.Evaluation.NewProjectFileOptions.None, System.Collections.Generic.IDictionary? globalProperties = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! -static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(string? directory, string! sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! -static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(System.IO.DirectoryInfo! directory, string! sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create() -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(string? directory, string? sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(System.IO.DirectoryInfo? directory = null, string? sdkVersion = null, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.implicit operator string!(Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! creator) -> string! diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Unshipped.txt index 4300428..318dde6 100644 --- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -1,19 +1,32 @@ #nullable enable Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator -Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.FullPath.get -> string! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.FullPath.get -> string? Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.MSBuildSdk(string! name, string! version) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save() -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save(string! directory) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Save(System.IO.DirectoryInfo! directory) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkAllowPrerelease(bool? allowPrerelease) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkErrorMessage(string? message) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkPath(string! path) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkRollForward(Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.SdkVersion(string? sdkVersion) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.TestRunner(string! name) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.ToJson() -> string! Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Disable = 4 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Feature = 6 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestFeature = 1 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestMajor = 3 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestMinor = 2 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.LatestPatch = 0 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Major = 8 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Minor = 7 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward +Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward.Patch = 5 -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ItemPackageVersion(Microsoft.Build.Utilities.ProjectCreation.Package! package, System.Collections.Generic.IDictionary? metadata = null, string? condition = null, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ItemPackageVersion(string! include, string! version, System.Collections.Generic.IDictionary? metadata = null, string? condition = null, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.TryBuild(System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! Microsoft.Build.Utilities.ProjectCreation.ProjectCreatorTemplates.DirectoryPackagesProps(System.Collections.Generic.IDictionary? packageVersions = null, string? directory = null, System.Action? projectCreator = null, Microsoft.Build.Evaluation.ProjectCollection? projectCollection = null, Microsoft.Build.Evaluation.NewProjectFileOptions? projectFileOptions = Microsoft.Build.Evaluation.NewProjectFileOptions.None, System.Collections.Generic.IDictionary? globalProperties = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! -static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(string? directory, string! sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! -static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(System.IO.DirectoryInfo! directory, string! sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create() -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(string? directory, string? sdkVersion, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! +static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.Create(System.IO.DirectoryInfo? directory = null, string? sdkVersion = null, Microsoft.Build.Utilities.ProjectCreation.GlobalJsonSdkRollForward? rollForward = null, bool? allowPrerelease = null) -> Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! static Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator.implicit operator string!(Microsoft.Build.Utilities.ProjectCreation.GlobalJsonCreator! creator) -> string! diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/Strings.Designer.cs b/src/Microsoft.Build.Utilities.ProjectCreation/Strings.Designer.cs index f093dda..824c27b 100644 --- a/src/Microsoft.Build.Utilities.ProjectCreation/Strings.Designer.cs +++ b/src/Microsoft.Build.Utilities.ProjectCreation/Strings.Designer.cs @@ -19,7 +19,7 @@ namespace Microsoft.Build.Utilities.ProjectCreation { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Strings { @@ -87,6 +87,15 @@ internal static string ErrorFilePathMustBeRelative { } } + /// + /// Looks up a localized string similar to A directory must be specified before the global.json can be saved.. + /// + internal static string ErrorGlobalJsonDirectoryNotSpecified { + get { + return ResourceManager.GetString("ErrorGlobalJsonDirectoryNotSpecified", resourceCulture); + } + } + /// /// Looks up a localized string similar to You can only add one Otherwise to a Choose.. /// diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/Strings.resx b/src/Microsoft.Build.Utilities.ProjectCreation/Strings.resx index b42753c..2f57247 100644 --- a/src/Microsoft.Build.Utilities.ProjectCreation/Strings.resx +++ b/src/Microsoft.Build.Utilities.ProjectCreation/Strings.resx @@ -168,4 +168,7 @@ You must specify either inline source code or a path to a source file, but not both. + + A directory must be specified before the global.json can be saved. + \ No newline at end of file