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;
        }
Exemplo n.º 2
0
        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)));
        }
Exemplo n.º 4
0
        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));
        }