public DotNetWorkloadsCheckup(SharedState sharedState, string sdkVersion, Manifest.DotNetWorkload[] requiredWorkloads, params string[] nugetPackageSources) : base() { var dotnet = new DotNetSdk(sharedState); SdkRoot = dotnet.DotNetSdkLocation.FullName; SdkVersion = sdkVersion; RequiredWorkloads = requiredWorkloads; NuGetPackageSources = nugetPackageSources; }
public DotNetPacksCheckup(SharedState sharedState, string sdkVersion, Manifest.DotNetSdkPack[] requiredPacks, params string[] nugetPackageSources) : base() { var dn = new DotNetSdk(sharedState); SdkRoot = dn.DotNetSdkLocation.FullName; SdkVersion = sdkVersion; RequiredPacks = requiredPacks; NuGetPackageSources = nugetPackageSources; }
public override Task <DiagnosticResult> Examine(SharedState history) { var dotnet = new DotNetSdk(history); var sdkRoot = dotnet.DotNetSdkLocation.FullName; if (history.TryGetEnvironmentVariable("DOTNET_SDK_VERSION", out var sdkVersion)) { // HACK / WORKAROUND // Workload manifest specs changed between p4/p5 and with that came manifest folder name changes // The problem is we can be left with duplicate workload manifests but in different // folder names and the resolver can't handle that. // This will identify a block list of old workload folders and delete them if the dotnet version // is -preview.5 or newer of the sdk and a different block list if -preview.4 or older if (NuGetVersion.TryParse(sdkVersion, out var parsedSdkVersion)) { DeleteBlockedWorkloads( sdkRoot, $"{parsedSdkVersion.Major}.{parsedSdkVersion.Minor}.{parsedSdkVersion.Patch}", parsedSdkVersion >= new NuGetVersion("6.0.100-preview.5") ? new[] { "Microsoft.NET.Workload.Android", "Microsoft.NET.Workload.BlazorWebAssembly", "Microsoft.NET.Workload.iOS", "Microsoft.NET.Workload.MacCatalyst", "Microsoft.NET.Workload.macOS", "Microsoft.NET.Workload.tvOS" } : new[] { "Microsoft.NET.Sdk.Android", "Microsoft.NET.Sdk.iOS", "Microsoft.NET.Sdk.MacCatalyst", "Microsoft.NET.Sdk.macOS", "Microsoft.NET.Sdk.tvOS", "Microsoft.NET.Workload.Mono.ToolChain" }); } } return(Task.FromResult(DiagnosticResult.Ok(this))); }
public override async Task <DiagnosticResult> Examine(SharedState history) { var dn = new DotNetSdk(history); var missingDiagnosis = new DiagnosticResult(Status.Error, this, new Suggestion(".NET SDK not installed")); if (!dn.Exists) { return(missingDiagnosis); } var sdks = await dn.GetSdks(); var missingSdks = new List <Manifest.DotNetSdk>(); var sentinelFiles = new List <string>(); if (RequiredSdks?.Any() ?? false) { foreach (var rs in RequiredSdks) { var rsVersion = NuGetVersion.Parse(rs.Version); if (!sdks.Any(s => (rs.RequireExact && s.Version == rsVersion) || (!rs.RequireExact && s.Version >= rsVersion))) { missingSdks.Add(rs); } } } DotNetSdkInfo bestSdk = null; foreach (var sdk in sdks) { // See if the sdk is one of the required sdk's var requiredSdk = RequiredSdks.FirstOrDefault(rs => sdk.Version == NuGetVersion.Parse(rs.Version)); if (requiredSdk != null) { if (bestSdk == null || sdk.Version > bestSdk.Version) { bestSdk = sdk; } if (requiredSdk.EnableWorkloadResolver) { var sentinelPath = Path.Combine(sdk.Directory.FullName, "EnableWorkloadResolver.sentinel"); sentinelFiles.Add(sentinelPath); } ReportStatus($"{sdk.Version} - {sdk.Directory}", Status.Ok); } else { ReportStatus($"{sdk.Version} - {sdk.Directory}", null); } } // If we didn't get the exact one before, let's find a new enough one if (bestSdk == null) { bestSdk = sdks.OrderByDescending(s => s.Version)?.FirstOrDefault(); } // Find newest compatible sdk if (bestSdk != null) { history.SetEnvironmentVariable("DOTNET_SDK", bestSdk.Directory.FullName); history.SetEnvironmentVariable("DOTNET_SDK_VERSION", bestSdk.Version.ToString()); } // Add sentinel files that should be considered if (sentinelFiles.Any()) { history.ContributeState(this, "sentinel_files", sentinelFiles.ToArray()); } if (missingSdks.Any()) { var str = SdkListToString(); var remedies = new List <Solution>(); if (Util.CI) { remedies.AddRange(missingSdks .Select(ms => new DotNetSdkScriptInstallSolution(ms.Version))); } else { remedies.AddRange(missingSdks .Where(ms => !ms.Url.AbsolutePath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) .Select(ms => new BootsSolution(ms.Url, ".NET SDK " + ms.Version) as Solution)); remedies.AddRange(missingSdks .Where(ms => ms.Url.AbsolutePath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) .Select(ms => new MsInstallerSolution(ms.Url, ".NET SDK " + ms.Version))); } return(new DiagnosticResult(Status.Error, this, $".NET SDK {str} not installed.", new Suggestion($"Download .NET SDK {str}", remedies.ToArray()))); } return(new DiagnosticResult(Status.Ok, this)); }