File: Commands\Workload\Install\IInstaller.cs
Web Access
Project: ..\..\..\src\Cli\dotnet\dotnet.csproj (dotnet)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using Microsoft.DotNet.Cli.Commands.Workload.Install.WorkloadInstallRecords;
using Microsoft.DotNet.Cli.ToolPackage;
using Microsoft.Extensions.EnvironmentAbstractions;
using Microsoft.NET.Sdk.WorkloadManifestReader;
 
namespace Microsoft.DotNet.Cli.Commands.Workload.Install;
 
internal interface IInstaller : IWorkloadManifestInstaller
{
    int ExitCode { get; }
 
    WorkloadSet GetWorkloadSetContents(string workloadVersion);
 
    void InstallWorkloads(IEnumerable<WorkloadId> workloadIds, SdkFeatureBand sdkFeatureBand, ITransactionContext transactionContext, DirectoryPath? offlineCache = null);
 
    void RepairWorkloads(IEnumerable<WorkloadId> workloadIds, SdkFeatureBand sdkFeatureBand, DirectoryPath? offlineCache = null);
 
    void GarbageCollect(Func<string, IWorkloadResolver> getResolverForWorkloadSet, DirectoryPath? offlineCache = null, bool cleanAllPacks = false);
 
    WorkloadSet InstallWorkloadSet(ITransactionContext context, string workloadSetVersion, DirectoryPath? offlineCache = null);
 
    void InstallWorkloadManifest(ManifestVersionUpdate manifestUpdate, ITransactionContext transactionContext, DirectoryPath? offlineCache = null);
 
    IWorkloadInstallationRecordRepository GetWorkloadInstallationRecordRepository();
 
    IEnumerable<WorkloadDownload> GetDownloads(IEnumerable<WorkloadId> workloadIds, SdkFeatureBand sdkFeatureBand, bool includeInstalledItems);
 
    void AdjustWorkloadSetInInstallState(SdkFeatureBand sdkFeatureBand, string workloadVersion);
 
    void WriteWorkloadHistoryRecord(WorkloadHistoryRecord workloadHistoryRecord, string sdkFeatureBand);
 
    IEnumerable<WorkloadHistoryRecord> GetWorkloadHistoryRecords(string sdkFeatureBand);
 
    /// <summary>
    /// Replace the workload resolver used by this installer. Typically used to call <see cref="GetDownloads(IEnumerable{WorkloadId}, SdkFeatureBand, bool)"/>
    /// for a set of workload manifests that isn't currently installed
    /// </summary>
    /// <param name="workloadResolver">A new workload resolver to use</param>
    void ReplaceWorkloadResolver(IWorkloadResolver workloadResolver);
 
    void Shutdown();
 
    /// <summary>
    /// Delete the install state file at the specified path.
    /// </summary>
    /// <param name="sdkFeatureBand">The SDK feature band of the install state file.</param>
    void RemoveManifestsFromInstallState(SdkFeatureBand sdkFeatureBand);
 
    /// <summary>
    /// Writes the specified JSON contents to the install state file.
    /// </summary>
    /// <param name="sdkFeatureBand">The SDK feature band of the install state file.</param>
    /// <param name="manifestContents">The JSON contents describing the install state.</param>
    void SaveInstallStateManifestVersions(SdkFeatureBand sdkFeatureBand, Dictionary<string, string> manifestContents);
 
    void UpdateInstallMode(SdkFeatureBand sdkFeatureBand, bool? newMode);
 
    void RecordWorkloadSetInGlobalJson(SdkFeatureBand sdkFeatureBand, string globalJsonPath, string workloadSetVersion);
}
 
// Interface to pass to workload manifest updater
internal interface IWorkloadManifestInstaller
{
    PackageId GetManifestPackageId(ManifestId manifestId, SdkFeatureBand featureBand);
 
    //  Extract the contents of the manifest (IE what's in the data directory in the file-based NuGet package) to the targetPath
    Task ExtractManifestAsync(string nupkgPath, string targetPath);
}
 
public class WorkloadDownload(string id, string nuGetPackageId, string nuGetPackageVersion)
{
    /// <summary>
    /// The ID of the workload pack or manifest to be downloaded (not necessarily the same as the <see cref="NuGetPackageId"/>)
    /// </summary>
    public string Id { get; } = id;
 
    public string NuGetPackageId { get; } = nuGetPackageId;
 
    public string NuGetPackageVersion { get; } = nuGetPackageVersion;
}