Example #1
0
        public override Task <DiagnosticResult> Examine(SharedState history)
        {
            if (!history.TryGetEnvironmentVariable("DOTNET_SDK_VERSION", out var sdkVersion))
            {
                sdkVersion = SdkVersion;
            }

            var workloadManager = new DotNetWorkloadManager(SdkRoot, sdkVersion, NuGetPackageSources);

            //var installedWorkloads = workloadManager.GetInstalledWorkloads();

            // This is a bit of a hack where we manually check the sdk-manifests/{SDK_VERSION}/* folders
            // for installed workloads, and then go manually parse the manifest json
            // as well as look for a .nuspec file from the extracted nupkg when it was installed
            // the nuspec file contains the version we actually care about for now since the manifest json
            // has a long number which is meaningless right now and will eventually be changed to a string
            // when that happens we can use the actual resolver's method to get installed workload info
            var installedPackageWorkloads = workloadManager.GetInstalledWorkloads();

            var missingWorkloads = new List <Manifest.DotNetWorkload>();

            foreach (var rp in RequiredWorkloads)
            {
                if (!NuGetVersion.TryParse(rp.Version, out var rpVersion))
                {
                    rpVersion = new NuGetVersion(0, 0, 0);
                }

                // TODO: Eventually check actual workload resolver api for installed workloads and
                // compare the manifest version once it has a string in it
                if (!installedPackageWorkloads.Any(ip => ip.id.Equals(rp.Id, StringComparison.OrdinalIgnoreCase) && NuGetVersion.TryParse(ip.version, out var ipVersion) && ipVersion == rpVersion))
                {
                    ReportStatus($"{rp.Id} ({rp.PackageId} : {rp.Version}) not installed.", Status.Error);
                    missingWorkloads.Add(rp);
                }
Example #2
0
        public DotNetPacksCheckup(string sdkVersion, Manifest.NuGetPackage[] requiredPacks, params string[] nugetPackageSources) : base()
        {
            SdkVersion          = sdkVersion;
            RequiredPacks       = requiredPacks;
            NuGetPackageSources = nugetPackageSources;

            dotnet          = new DotNet();
            SdkRoot         = dotnet.DotNetSdkLocation.FullName;
            workloadManager = new DotNetWorkloadManager(SdkRoot, SdkVersion, NuGetPackageSources);
        }
Example #3
0
        public override async Task Implement(SharedState sharedState, CancellationToken cancellationToken)
        {
            await base.Implement(sharedState, cancellationToken);

            ReportStatus($"Installing Pack: {Package.Id}...");

            var workloadManager = new DotNetWorkloadManager(SdkRoot, SdkVersion, NuGetPackageSources);

            if (await workloadManager.InstallWorkloadPack(SdkRoot, Package, cancellationToken))
            {
                ReportStatus($"Installed Pack: {Package.Id}.");
            }
            else
            {
                ReportStatus($"Failed to install Pack: {Package.Id}.");
            }
        }
Example #4
0
        public override Task <DiagnosticResult> Examine(SharedState history)
        {
            string sdkVersion;

            if (!history.TryGetEnvironmentVariable("DOTNET_SDK_VERSION", out sdkVersion))
            {
                sdkVersion = SdkVersion;
            }

            var workloadManager = new DotNetWorkloadManager(SdkRoot, sdkVersion, NuGetPackageSources);

            var sdkPacks = workloadManager.GetAllInstalledWorkloadPacks();

            var missingPacks = new List <Manifest.DotNetSdkPack>();

            foreach (var rp in GetAllRequiredPacks(history))
            {
                Util.Log($"Looking for pack: {rp.Id} ({rp.Version})");

                if (!sdkPacks.Any(sp => sp.Id == rp.Id && sp.Version == rp.Version) &&
                    !workloadManager.TemplateExistsOnDisk(rp.Id, rp.Version, rp.PackKind, rp.TemplateShortName) &&
                    !workloadManager.PackExistsOnDisk(rp.Id, rp.Version))
                {
                    ReportStatus($"{rp.Id} ({rp.Version}) not installed.", Status.Warning);
                    missingPacks.Add(rp);
                }
                else
                {
                    ReportStatus($"{rp.Id} ({rp.Version}) installed.", Status.Ok);
                }
            }

            if (!missingPacks.Any())
            {
                return(Task.FromResult(DiagnosticResult.Ok(this)));
            }

            var remedies = missingPacks
                           .Select(ms => new DotNetPackInstallSolution(SdkRoot, sdkVersion, ms, NuGetPackageSources));

            return(Task.FromResult(new DiagnosticResult(
                                       Status.Error,
                                       this,
                                       new Suggestion("Install Missing SDK Packs",
                                                      remedies.ToArray()))));
        }
        public override async Task Implement(SharedState sharedState, CancellationToken cancellationToken)
        {
            await base.Implement(sharedState, cancellationToken);

            ReportStatus($"Installing Workload: {Workload.Id}...");

            var workloadManager = new DotNetWorkloadManager(SdkRoot, SdkVersion, NuGetPackageSources);

            if (NuGetVersion.TryParse(Workload.Version, out var version))
            {
                // Manually download and install the manifest to get an explicit version of it to install
                // we have to run `dotnet workload install <id> --skip-manifest-update` to make this happen
                if (await workloadManager.InstallWorkloadManifest(Workload.PackageId, Workload.Id, version, cancellationToken))
                {
                    // This runs the `dotnet workload install <id> --skip-manifest-update`
                    await workloadManager.CliInstall(Workload.Id);

                    // Find any template packs that the workload comes with
                    // we want to try and `dotnet new --uninstall` them
                    // Since if one was previously installed with `dotnet new -i` it will be chosen over the optional workload
                    // version and the user could get a message about a newer template being available to install
                    var templatePacks = workloadManager.GetPacksInWorkload(Workload.Id)?.Where(p => p.Kind == Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadPackKind.Template);

                    if (templatePacks?.Any() ?? false)
                    {
                        ReportStatus("Uninstalling previous template versions...");

                        foreach (var tp in templatePacks)
                        {
                            try { await workloadManager.UninstallTemplate(tp.Id); }
                            catch { }
                        }
                    }
                }

                // Install: dotnet workload install id --
                ReportStatus($"Installed Workload: {Workload.Id}.");
            }
            else
            {
                var msg = $"Failed to install workload: {Workload.Id}.";
                ReportStatus(msg);
                throw new System.Exception(msg);
            }
        }
        public override async Task Implement(SharedState sharedState, CancellationToken cancellationToken)
        {
            await base.Implement(sharedState, cancellationToken);

            ReportStatus($"Installing Workload: {Workload.Id}...");

            var workloadManager = new DotNetWorkloadManager(SdkRoot, SdkVersion, NuGetPackageSources);

            if (NuGetVersion.TryParse(Workload.Version, out var version) &&
                await workloadManager.InstallWorkloadManifest(Workload.PackageId, version, cancellationToken))
            {
                ReportStatus($"Installed Workload: {Workload.Id}.");
            }
            else
            {
                ReportStatus($"Failed to install workload: {Workload.Id}.");
            }
        }
        public override async Task <DiagnosticResult> Examine(SharedState history)
        {
            if (!history.TryGetEnvironmentVariable("DOTNET_SDK_VERSION", out var sdkVersion))
            {
                sdkVersion = SdkVersion;
            }

            var force = history.TryGetEnvironmentVariable("DOTNET_FORCE", out var forceDotNet) &&
                        (forceDotNet?.Equals("true", StringComparison.OrdinalIgnoreCase) ?? false) &&
                        !wasForceRunAlready;

            // Don't allow multiple force runs, just the first
            if (force)
            {
                wasForceRunAlready = true;
            }

            var workloadManager = new DotNetWorkloadManager(SdkRoot, sdkVersion, NuGetPackageSources);

            var installedPackageWorkloads = workloadManager.GetInstalledWorkloads();

            var missingWorkloads = new List <Manifest.DotNetWorkload>();

            foreach (var rp in RequiredWorkloads)
            {
                if (!NuGetVersion.TryParse(rp.Version, out var rpVersion))
                {
                    rpVersion = new NuGetVersion(0, 0, 0);
                }

                // TODO: Eventually check actual workload resolver api for installed workloads and
                // compare the manifest version once it has a string in it
                if (!installedPackageWorkloads.Any(ip => ip.id.Equals(rp.Id, StringComparison.OrdinalIgnoreCase) && NuGetVersion.TryParse(ip.version, out var ipVersion) && ipVersion == rpVersion))
                {
                    ReportStatus($"{rp.Id} ({rp.PackageId} : {rp.Version}) not installed.", Status.Error);
                    missingWorkloads.Add(rp);
                }
Example #8
0
 public DotNetWorkloadInstallRemedy(string sdkRoot, string sdkVersion, DotNetWorkload[] packages, params string[] nugetPackageSources)
 {
     Packages        = packages;
     WorkloadManager = new DotNetWorkloadManager(sdkRoot, sdkVersion, nugetPackageSources);
 }
        public override Task <DiagnosticResult> Examine(SharedState history)
        {
            string sdkVersion;

            if (!history.TryGetEnvironmentVariable("DOTNET_SDK_VERSION", out sdkVersion))
            {
                sdkVersion = SdkVersion;
            }

            var workloadManager = new DotNetWorkloadManager(SdkRoot, sdkVersion, NuGetPackageSources);

            var installedWorkloads        = workloadManager.GetInstalledWorkloads();
            var installedPackageWorkloads = workloadManager.GetInstalledWorkloadNuGetPackages();

            var missingWorkloads = new List <Manifest.DotNetWorkload>();

            var requiredPacks = new List <WorkloadResolver.PackInfo>();

            foreach (var rp in RequiredWorkloads)
            {
                NuGetVersion rpVersion;
                if (!NuGetVersion.TryParse(rp.Version, out rpVersion))
                {
                    rpVersion = new NuGetVersion(0, 0, 0);
                }

                if (!installedPackageWorkloads.Any(sp => sp.packageId.Equals(rp.PackageId, StringComparison.OrdinalIgnoreCase) && sp.packageVersion == rpVersion) ||
                    !installedWorkloads.Any(sp => sp.id.Equals(rp.Id, StringComparison.OrdinalIgnoreCase)))
                {
                    ReportStatus($"{rp.Id} ({rp.PackageId} : {rp.Version}) not installed.", Status.Error);
                    missingWorkloads.Add(rp);
                }
                else
                {
                    ReportStatus($"{rp.Id} ({rp.PackageId} : {rp.Version}) installed.", Status.Ok);

                    var workloadPacks = workloadManager.GetPacksInWorkload(rp.Id);

                    if (workloadPacks != null && workloadPacks.Any())
                    {
                        foreach (var wp in workloadPacks)
                        {
                            if (!(rp.IgnoredPackIds?.Any(ip => ip.Equals(wp.Id, StringComparison.OrdinalIgnoreCase)) ?? false))
                            {
                                requiredPacks.Add(wp);
                            }
                        }
                    }
                }
            }

            if (requiredPacks.Any())
            {
                history.ContributeState(this, "required_packs", requiredPacks.ToArray());
            }

            if (!missingWorkloads.Any())
            {
                return(Task.FromResult(DiagnosticResult.Ok(this)));
            }

            var remedies = missingWorkloads
                           .Select(mw => new DotNetWorkloadInstallSolution(SdkRoot, sdkVersion, mw, NuGetPackageSources));

            return(Task.FromResult(new DiagnosticResult(
                                       Status.Error,
                                       this,
                                       new Suggestion("Install Missing SDK Workloads",
                                                      remedies.ToArray()))));
        }