in src/BuildScriptGenerator/DotNetCore/GlobalJsonSdkResolver.cs [81:185]
public string GetSatisfyingSdkVersion(GlobalJsonModel globalJson, IEnumerable<string> availableSdks)
{
/*
From spec:
If no global.json file is found, or global.json doesn't specify an SDK version nor an
allowPrerelease value, the highest installed SDK version is used (equivalent to setting rollForward
to latestMajor).
*/
if (globalJson?.Sdk == null)
{
globalJson = new GlobalJsonModel();
globalJson.Sdk = new SdkModel
{
Version = "0.0.000",
RollForward = RollForwardPolicy.LatestMajor,
};
_logger.LogDebug(
$"No 'sdk' provided in global.json. Choosing a version using the " +
$"default 'rollForward' policy: {globalJson.Sdk.RollForward}");
}
var sdkNodeInGlobalJson = globalJson.Sdk;
if (!SdkVersionInfo.TryParse(sdkNodeInGlobalJson.Version, out var sdkVersionInGlobalJson))
{
throw new InvalidUsageException($"Invalid version format '{sdkNodeInGlobalJson}' in global.json");
}
var parsedSdkVersions = new List<SdkVersionInfo>();
var unparsedSdkVersions = new List<string>();
foreach (var sdkVersion in availableSdks)
{
if (SdkVersionInfo.TryParse(sdkVersion, out var parsedSdkVersion))
{
parsedSdkVersions.Add(parsedSdkVersion);
}
else
{
unparsedSdkVersions.Add(sdkVersion);
}
}
if (unparsedSdkVersions.Count > 0)
{
_logger.LogDebug(
"Unable to parse sdk versions: {unparsedSdkVersions}",
string.Join(", ", unparsedSdkVersions));
}
var availableSdkVersions = parsedSdkVersions.AsEnumerable();
if (!sdkNodeInGlobalJson.AllowPreRelease)
{
availableSdkVersions = availableSdkVersions.Where(sdk => !sdk.IsPrerelease);
}
string resolvedVersion = null;
switch (sdkNodeInGlobalJson.RollForward)
{
case RollForwardPolicy.Disable:
resolvedVersion = GetDisable(availableSdkVersions, sdkVersionInGlobalJson);
break;
case RollForwardPolicy.Patch:
resolvedVersion = GetPatch(availableSdkVersions, sdkVersionInGlobalJson);
break;
case RollForwardPolicy.Feature:
resolvedVersion = GetFeature(availableSdkVersions, sdkVersionInGlobalJson);
break;
case RollForwardPolicy.Minor:
resolvedVersion = GetMinor(availableSdkVersions, sdkVersionInGlobalJson);
break;
case RollForwardPolicy.Major:
resolvedVersion = GetMajor(availableSdkVersions, sdkVersionInGlobalJson);
break;
case RollForwardPolicy.LatestPatch:
resolvedVersion = GetLatestPatch(availableSdkVersions, sdkVersionInGlobalJson);
break;
case RollForwardPolicy.LatestFeature:
resolvedVersion = GetLatestFeature(availableSdkVersions, sdkVersionInGlobalJson);
break;
case RollForwardPolicy.LatestMinor:
resolvedVersion = GetLatestMinor(availableSdkVersions, sdkVersionInGlobalJson);
break;
case RollForwardPolicy.LatestMajor:
resolvedVersion = GetLatestMajor(availableSdkVersions, sdkVersionInGlobalJson);
break;
default:
_logger.LogDebug(
"Value {invalidRollForwardPolicy} is invalid for 'rollFoward' policy.",
sdkNodeInGlobalJson.RollForward.ToString());
return null;
}
if (resolvedVersion == null)
{
_logger.LogDebug(
"Could not resolve a version using roll forward policy {rollForwardPolicy} and available sdk " +
"versions {availableSdkVersions}",
sdkNodeInGlobalJson.RollForward.ToString(),
string.Join(", ", availableSdks));
}
return resolvedVersion;
}