提交 9582c433 编写于 作者: S Sam Harwell

Lazily load NuGet package source information

上级 07471570
......@@ -55,7 +55,7 @@ public async Task TestSearchPackageSingleName()
installerServiceMock.Setup(i => i.IsEnabled(It.IsAny<ProjectId>())).Returns(true);
installerServiceMock.Setup(i => i.IsInstalled(It.IsAny<Workspace>(), It.IsAny<ProjectId>(), "NuGetPackage")).Returns(false);
installerServiceMock.Setup(i => i.GetInstalledVersions("NuGetPackage")).Returns(ImmutableArray<string>.Empty);
installerServiceMock.SetupGet(i => i.PackageSources).Returns(NugetPackageSources);
installerServiceMock.Setup(i => i.GetPackageSourcesAsync(It.IsAny<CancellationToken>())).Returns(new ValueTask<ImmutableArray<PackageSource>>(NugetPackageSources));
installerServiceMock.Setup(s => s.TryInstallPackage(It.IsAny<Workspace>(), It.IsAny<DocumentId>(), It.IsAny<string>(), "NuGetPackage", It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))
.Returns(true);
......@@ -86,7 +86,7 @@ public async Task TestSearchPackageMultipleNames()
installerServiceMock.Setup(i => i.IsEnabled(It.IsAny<ProjectId>())).Returns(true);
installerServiceMock.Setup(i => i.IsInstalled(It.IsAny<Workspace>(), It.IsAny<ProjectId>(), "NuGetPackage")).Returns(false);
installerServiceMock.Setup(i => i.GetInstalledVersions("NuGetPackage")).Returns(ImmutableArray<string>.Empty);
installerServiceMock.SetupGet(i => i.PackageSources).Returns(NugetPackageSources);
installerServiceMock.Setup(i => i.GetPackageSourcesAsync(It.IsAny<CancellationToken>())).Returns(new ValueTask<ImmutableArray<PackageSource>>(NugetPackageSources));
installerServiceMock.Setup(s => s.TryInstallPackage(It.IsAny<Workspace>(), It.IsAny<DocumentId>(), It.IsAny<string>(), "NuGetPackage", It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))
.Returns(true);
......@@ -115,7 +115,7 @@ public async Task TestMissingIfPackageAlreadyInstalled()
{
var installerServiceMock = new Mock<IPackageInstallerService>(MockBehavior.Strict);
installerServiceMock.Setup(i => i.IsEnabled(It.IsAny<ProjectId>())).Returns(true);
installerServiceMock.SetupGet(i => i.PackageSources).Returns(NugetPackageSources);
installerServiceMock.Setup(i => i.GetPackageSourcesAsync(It.IsAny<CancellationToken>())).Returns(new ValueTask<ImmutableArray<PackageSource>>(NugetPackageSources));
installerServiceMock.Setup(s => s.IsInstalled(It.IsAny<Workspace>(), It.IsAny<ProjectId>(), "NuGetPackage"))
.Returns(true);
......@@ -141,7 +141,7 @@ public async Task TestOptionsOffered()
installerServiceMock.Setup(i => i.IsInstalled(It.IsAny<Workspace>(), It.IsAny<ProjectId>(), "NuGetPackage")).Returns(false);
installerServiceMock.Setup(i => i.GetProjectsWithInstalledPackage(It.IsAny<Solution>(), "NuGetPackage", "1.0")).Returns(Enumerable.Empty<Project>());
installerServiceMock.Setup(i => i.GetProjectsWithInstalledPackage(It.IsAny<Solution>(), "NuGetPackage", "2.0")).Returns(Enumerable.Empty<Project>());
installerServiceMock.SetupGet(i => i.PackageSources).Returns(NugetPackageSources);
installerServiceMock.Setup(i => i.GetPackageSourcesAsync(It.IsAny<CancellationToken>())).Returns(new ValueTask<ImmutableArray<PackageSource>>(NugetPackageSources));
installerServiceMock.Setup(s => s.GetInstalledVersions("NuGetPackage"))
.Returns(ImmutableArray.Create("1.0", "2.0"));
......@@ -185,7 +185,7 @@ public async Task TestInstallGetsCalledNoVersion()
installerServiceMock.Setup(i => i.IsEnabled(It.IsAny<ProjectId>())).Returns(true);
installerServiceMock.Setup(i => i.IsInstalled(It.IsAny<Workspace>(), It.IsAny<ProjectId>(), "NuGetPackage")).Returns(false);
installerServiceMock.Setup(i => i.GetInstalledVersions("NuGetPackage")).Returns(ImmutableArray<string>.Empty);
installerServiceMock.SetupGet(i => i.PackageSources).Returns(NugetPackageSources);
installerServiceMock.Setup(i => i.GetPackageSourcesAsync(It.IsAny<CancellationToken>())).Returns(new ValueTask<ImmutableArray<PackageSource>>(NugetPackageSources));
installerServiceMock.Setup(s => s.TryInstallPackage(It.IsAny<Workspace>(), It.IsAny<DocumentId>(), It.IsAny<string>(), "NuGetPackage", /*versionOpt*/ null, It.IsAny<bool>(), It.IsAny<CancellationToken>()))
.Returns(true);
......@@ -217,7 +217,7 @@ public async Task TestInstallGetsCalledWithVersion()
installerServiceMock.Setup(i => i.IsEnabled(It.IsAny<ProjectId>())).Returns(true);
installerServiceMock.Setup(i => i.IsInstalled(It.IsAny<Workspace>(), It.IsAny<ProjectId>(), "NuGetPackage")).Returns(false);
installerServiceMock.Setup(i => i.GetProjectsWithInstalledPackage(It.IsAny<Solution>(), "NuGetPackage", "1.0")).Returns(Enumerable.Empty<Project>());
installerServiceMock.SetupGet(i => i.PackageSources).Returns(NugetPackageSources);
installerServiceMock.Setup(i => i.GetPackageSourcesAsync(It.IsAny<CancellationToken>())).Returns(new ValueTask<ImmutableArray<PackageSource>>(NugetPackageSources));
installerServiceMock.Setup(s => s.GetInstalledVersions("NuGetPackage"))
.Returns(ImmutableArray.Create("1.0"));
installerServiceMock.Setup(s => s.TryInstallPackage(It.IsAny<Workspace>(), It.IsAny<DocumentId>(), It.IsAny<string>(), "NuGetPackage", "1.0", It.IsAny<bool>(), It.IsAny<CancellationToken>()))
......@@ -251,7 +251,7 @@ public async Task TestFailedInstallRollsBackFile()
installerServiceMock.Setup(i => i.IsEnabled(It.IsAny<ProjectId>())).Returns(true);
installerServiceMock.Setup(i => i.IsInstalled(It.IsAny<Workspace>(), It.IsAny<ProjectId>(), "NuGetPackage")).Returns(false);
installerServiceMock.Setup(i => i.GetProjectsWithInstalledPackage(It.IsAny<Solution>(), "NuGetPackage", "1.0")).Returns(Enumerable.Empty<Project>());
installerServiceMock.SetupGet(i => i.PackageSources).Returns(NugetPackageSources);
installerServiceMock.Setup(i => i.GetPackageSourcesAsync(It.IsAny<CancellationToken>())).Returns(new ValueTask<ImmutableArray<PackageSource>>(NugetPackageSources));
installerServiceMock.Setup(s => s.GetInstalledVersions("NuGetPackage"))
.Returns(ImmutableArray.Create("1.0"));
installerServiceMock.Setup(s => s.TryInstallPackage(It.IsAny<Workspace>(), It.IsAny<DocumentId>(), It.IsAny<string>(), "NuGetPackage", "1.0", It.IsAny<bool>(), It.IsAny<CancellationToken>()))
......
......@@ -50,7 +50,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeActions.AddImp
installerServiceMock.Setup(Function(i) i.IsEnabled(It.IsAny(Of ProjectId))).Returns(True)
installerServiceMock.Setup(Function(i) i.IsInstalled(It.IsAny(Of Workspace), It.IsAny(Of ProjectId), "NuGetPackage")).Returns(False)
installerServiceMock.Setup(Function(i) i.GetInstalledVersions("NuGetPackage")).Returns(ImmutableArray(Of String).Empty)
installerServiceMock.SetupGet(Function(i) i.PackageSources).Returns(NugetPackageSources)
installerServiceMock.Setup(Function(i) i.GetPackageSourcesAsync(It.IsAny(Of CancellationToken)())).Returns(New ValueTask(Of ImmutableArray(Of PackageSource))(NugetPackageSources))
installerServiceMock.Setup(Function(s) s.TryInstallPackage(It.IsAny(Of Workspace), It.IsAny(Of DocumentId), It.IsAny(Of String), "NuGetPackage", It.IsAny(Of String), It.IsAny(Of Boolean), It.IsAny(Of CancellationToken))).
Returns(True)
......@@ -79,7 +79,7 @@ End Class", fixProviderData:=New ProviderData(installerServiceMock.Object, packa
installerServiceMock.Setup(Function(i) i.IsEnabled(It.IsAny(Of ProjectId))).Returns(True)
installerServiceMock.Setup(Function(i) i.IsInstalled(It.IsAny(Of Workspace), It.IsAny(Of ProjectId), "NuGetPackage")).Returns(False)
installerServiceMock.Setup(Function(i) i.GetInstalledVersions("NuGetPackage")).Returns(ImmutableArray(Of String).Empty)
installerServiceMock.SetupGet(Function(i) i.PackageSources).Returns(NugetPackageSources)
installerServiceMock.Setup(Function(i) i.GetPackageSourcesAsync(It.IsAny(Of CancellationToken)())).Returns(New ValueTask(Of ImmutableArray(Of PackageSource))(NugetPackageSources))
installerServiceMock.Setup(Function(s) s.TryInstallPackage(It.IsAny(Of Workspace), It.IsAny(Of DocumentId), It.IsAny(Of String), "NuGetPackage", It.IsAny(Of String), It.IsAny(Of Boolean), It.IsAny(Of CancellationToken))).
Returns(True)
......@@ -108,7 +108,7 @@ End Class", fixProviderData:=New ProviderData(installerServiceMock.Object, packa
installerServiceMock.Setup(Function(i) i.IsEnabled(It.IsAny(Of ProjectId))).Returns(True)
installerServiceMock.Setup(Function(i) i.IsInstalled(It.IsAny(Of Workspace), It.IsAny(Of ProjectId), "NuGetPackage")).Returns(False)
installerServiceMock.Setup(Function(i) i.GetInstalledVersions("NuGetPackage")).Returns(ImmutableArray(Of String).Empty)
installerServiceMock.SetupGet(Function(i) i.PackageSources).Returns(NugetPackageSources)
installerServiceMock.Setup(Function(i) i.GetPackageSourcesAsync(It.IsAny(Of CancellationToken)())).Returns(New ValueTask(Of ImmutableArray(Of PackageSource))(NugetPackageSources))
installerServiceMock.Setup(Function(s) s.TryInstallPackage(It.IsAny(Of Workspace), It.IsAny(Of DocumentId), It.IsAny(Of String), "NuGetPackage", It.IsAny(Of String), It.IsAny(Of Boolean), It.IsAny(Of CancellationToken))).
Returns(False)
......@@ -133,7 +133,7 @@ End Class", fixProviderData:=New ProviderData(installerServiceMock.Object, packa
Public Async Function TestMissingIfPackageAlreadyInstalled() As Task
Dim installerServiceMock = New Mock(Of IPackageInstallerService)(MockBehavior.Strict)
installerServiceMock.Setup(Function(i) i.IsEnabled(It.IsAny(Of ProjectId))).Returns(True)
installerServiceMock.SetupGet(Function(i) i.PackageSources).Returns(NugetPackageSources)
installerServiceMock.Setup(Function(i) i.GetPackageSourcesAsync(It.IsAny(Of CancellationToken)())).Returns(New ValueTask(Of ImmutableArray(Of PackageSource))(NugetPackageSources))
installerServiceMock.Setup(Function(s) s.IsInstalled(It.IsAny(Of Workspace)(), It.IsAny(Of ProjectId)(), "NuGetPackage")).
Returns(True)
......@@ -158,7 +158,7 @@ New TestParameters(fixProviderData:=New ProviderData(installerServiceMock.Object
installerServiceMock.Setup(Function(i) i.IsInstalled(It.IsAny(Of Workspace), It.IsAny(Of ProjectId), "NuGetPackage")).Returns(False)
installerServiceMock.Setup(Function(i) i.GetProjectsWithInstalledPackage(It.IsAny(Of Solution), "NuGetPackage", "1.0")).Returns(Enumerable.Empty(Of Project))
installerServiceMock.Setup(Function(i) i.GetProjectsWithInstalledPackage(It.IsAny(Of Solution), "NuGetPackage", "2.0")).Returns(Enumerable.Empty(Of Project))
installerServiceMock.SetupGet(Function(i) i.PackageSources).Returns(NugetPackageSources)
installerServiceMock.Setup(Function(i) i.GetPackageSourcesAsync(It.IsAny(Of CancellationToken)())).Returns(New ValueTask(Of ImmutableArray(Of PackageSource))(NugetPackageSources))
installerServiceMock.Setup(Function(s) s.GetInstalledVersions("NuGetPackage")).
Returns(ImmutableArray.Create("1.0", "2.0"))
......@@ -200,7 +200,7 @@ parameters:=New TestParameters(index:=2, fixProviderData:=data))
installerServiceMock.Setup(Function(i) i.IsEnabled(It.IsAny(Of ProjectId))).Returns(True)
installerServiceMock.Setup(Function(i) i.IsInstalled(It.IsAny(Of Workspace), It.IsAny(Of ProjectId), "NuGetPackage")).Returns(False)
installerServiceMock.Setup(Function(i) i.GetInstalledVersions("NuGetPackage")).Returns(ImmutableArray(Of String).Empty)
installerServiceMock.SetupGet(Function(i) i.PackageSources).Returns(NugetPackageSources)
installerServiceMock.Setup(Function(i) i.GetPackageSourcesAsync(It.IsAny(Of CancellationToken)())).Returns(New ValueTask(Of ImmutableArray(Of PackageSource))(NugetPackageSources))
installerServiceMock.Setup(Function(s) s.TryInstallPackage(It.IsAny(Of Workspace), It.IsAny(Of DocumentId), It.IsAny(Of String), "NuGetPackage", Nothing, It.IsAny(Of Boolean), It.IsAny(Of CancellationToken))).
Returns(True)
......@@ -230,7 +230,7 @@ End Class", fixProviderData:=New ProviderData(installerServiceMock.Object, packa
installerServiceMock.Setup(Function(i) i.IsEnabled(It.IsAny(Of ProjectId))).Returns(True)
installerServiceMock.Setup(Function(i) i.IsInstalled(It.IsAny(Of Workspace), It.IsAny(Of ProjectId), "NuGetPackage")).Returns(False)
installerServiceMock.Setup(Function(i) i.GetProjectsWithInstalledPackage(It.IsAny(Of Solution), "NuGetPackage", "1.0")).Returns(Enumerable.Empty(Of Project))
installerServiceMock.SetupGet(Function(i) i.PackageSources).Returns(NugetPackageSources)
installerServiceMock.Setup(Function(i) i.GetPackageSourcesAsync(It.IsAny(Of CancellationToken)())).Returns(New ValueTask(Of ImmutableArray(Of PackageSource))(NugetPackageSources))
installerServiceMock.Setup(Function(s) s.GetInstalledVersions("NuGetPackage")).
Returns(ImmutableArray.Create("1.0"))
installerServiceMock.Setup(Function(s) s.TryInstallPackage(It.IsAny(Of Workspace), It.IsAny(Of DocumentId), It.IsAny(Of String), "NuGetPackage", "1.0", It.IsAny(Of Boolean), It.IsAny(Of CancellationToken))).
......
......@@ -55,7 +55,7 @@ public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
var installerService = GetPackageInstallerService(document);
var packageSources = searchNuGetPackages && symbolSearchService != null && installerService != null
? installerService.PackageSources
? await installerService.GetPackageSourcesAsync(cancellationToken).ConfigureAwait(false)
: ImmutableArray<PackageSource>.Empty;
var fixesForDiagnostic = await addImportService.GetFixesForDiagnosticsAsync(
......
......@@ -56,7 +56,7 @@ internal abstract partial class AbstractAddPackageCodeFixProvider : CodeFixProvi
searchNugetPackages &&
installerService.IsEnabled(document.Project.Id))
{
foreach (var packageSource in installerService.PackageSources)
foreach (var packageSource in await installerService.GetPackageSourcesAsync(cancellationToken).ConfigureAwait(false))
{
cancellationToken.ThrowIfCancellationRequested();
......
......@@ -48,10 +48,17 @@ internal partial class PackageInstallerService : AbstractDelayStartedService, IP
private readonly SVsServiceProvider _serviceProvider;
private readonly IVsEditorAdaptersFactoryService _editorAdaptersFactoryService;
private readonly Lazy<IVsPackageInstallerServices> _packageInstallerServices;
private readonly Lazy<IVsPackageInstaller2> _packageInstaller;
private readonly Lazy<IVsPackageUninstaller> _packageUninstaller;
private readonly Lazy<IVsPackageSourceProvider> _packageSourceProvider;
// We refer to the package services through proxy types so that we can
// delay loading their DLLs until we actually need them.
private IPackageServicesProxy _packageServices;
private ImmutableArray<PackageSource> _packageSources;
private CancellationTokenSource _tokenSource = new CancellationTokenSource();
// We keep track of what types of changes we've seen so we can then determine what to
......@@ -69,7 +76,11 @@ internal partial class PackageInstallerService : AbstractDelayStartedService, IP
IThreadingContext threadingContext,
VisualStudioWorkspaceImpl workspace,
SVsServiceProvider serviceProvider,
IVsEditorAdaptersFactoryService editorAdaptersFactoryService)
IVsEditorAdaptersFactoryService editorAdaptersFactoryService,
[Import(AllowDefault = true)] Lazy<IVsPackageInstallerServices> packageInstallerServices,
[Import(AllowDefault = true)] Lazy<IVsPackageInstaller2> packageInstaller,
[Import(AllowDefault = true)] Lazy<IVsPackageUninstaller> packageUninstaller,
[Import(AllowDefault = true)] Lazy<IVsPackageSourceProvider> packageSourceProvider)
: base(threadingContext, workspace, SymbolSearchOptions.Enabled,
SymbolSearchOptions.SuggestForTypesInReferenceAssemblies,
SymbolSearchOptions.SuggestForTypesInNuGetPackages)
......@@ -77,9 +88,44 @@ internal partial class PackageInstallerService : AbstractDelayStartedService, IP
_workspace = workspace;
_serviceProvider = serviceProvider;
_editorAdaptersFactoryService = editorAdaptersFactoryService;
_packageInstallerServices = packageInstallerServices;
_packageInstaller = packageInstaller;
_packageUninstaller = packageUninstaller;
_packageSourceProvider = packageSourceProvider;
}
public ImmutableArray<PackageSource> PackageSources { get; private set; } = ImmutableArray<PackageSource>.Empty;
public async ValueTask<ImmutableArray<PackageSource>> GetPackageSourcesAsync(CancellationToken cancellationToken)
{
var packageSources = _packageSources;
if (packageSources != null)
{
return packageSources;
}
try
{
await ThreadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
packageSources = _packageServices.GetSources(includeUnOfficial: true, includeDisabled: false)
.Select(r => new PackageSource(r.Key, r.Value))
.ToImmutableArrayOrEmpty();
}
catch (Exception ex) when (ex is InvalidDataException || ex is InvalidOperationException)
{
// These exceptions can happen when the nuget.config file is broken.
packageSources = ImmutableArray<PackageSource>.Empty;
}
var previousPackageSources = ImmutableInterlocked.InterlockedCompareExchange(ref _packageSources, packageSources, default);
if (previousPackageSources != null)
{
// Another thread already initialized _packageSources
packageSources = previousPackageSources;
}
return packageSources;
}
public event EventHandler PackageSourcesChanged;
......@@ -106,21 +152,16 @@ protected override void EnableService()
// Our service has been enabled. Now load the VS package dlls.
var componentModel = (IComponentModel)_serviceProvider.GetService(typeof(SComponentModel));
var packageInstallerServices = componentModel.GetExtensions<IVsPackageInstallerServices>().FirstOrDefault();
var packageInstaller = componentModel.GetExtensions<IVsPackageInstaller2>().FirstOrDefault();
var packageUninstaller = componentModel.GetExtensions<IVsPackageUninstaller>().FirstOrDefault();
var packageSourceProvider = componentModel.GetExtensions<IVsPackageSourceProvider>().FirstOrDefault();
if (packageInstallerServices == null ||
packageInstaller == null ||
packageUninstaller == null ||
packageSourceProvider == null)
if (_packageInstallerServices == null ||
_packageInstaller == null ||
_packageUninstaller == null ||
_packageSourceProvider == null)
{
return;
}
_packageServices = new PackageServicesProxy(
packageInstallerServices, packageInstaller, packageUninstaller, packageSourceProvider);
_packageInstallerServices, _packageInstaller, _packageUninstaller, _packageSourceProvider);
// Start listening to additional events workspace changes.
_workspace.WorkspaceChanged += OnWorkspaceChanged;
......@@ -143,26 +184,7 @@ protected override void StartWorking()
private void OnSourceProviderSourcesChanged(object sender, EventArgs e)
{
if (!this.IsForeground())
{
this.InvokeBelowInputPriorityAsync(() => OnSourceProviderSourcesChanged(sender, e));
return;
}
this.AssertIsForeground();
try
{
PackageSources = _packageServices.GetSources(includeUnOfficial: true, includeDisabled: false)
.Select(r => new PackageSource(r.Key, r.Value))
.ToImmutableArrayOrEmpty();
}
catch (Exception ex) when (ex is InvalidDataException || ex is InvalidOperationException)
{
// These exceptions can happen when the nuget.config file is broken.
PackageSources = ImmutableArray<PackageSource>.Empty;
}
_packageSources = default;
PackageSourcesChanged?.Invoke(this, EventArgs.Empty);
}
......@@ -659,16 +681,16 @@ public uint GetTokens(uint dwMaxTokens, IVsSearchToken[] rgpSearchTokens)
private class PackageServicesProxy : IPackageServicesProxy
{
private readonly IVsPackageInstaller2 _packageInstaller;
private readonly IVsPackageInstallerServices _packageInstallerServices;
private readonly IVsPackageSourceProvider _packageSourceProvider;
private readonly IVsPackageUninstaller _packageUninstaller;
private readonly Lazy<IVsPackageInstaller2> _packageInstaller;
private readonly Lazy<IVsPackageInstallerServices> _packageInstallerServices;
private readonly Lazy<IVsPackageSourceProvider> _packageSourceProvider;
private readonly Lazy<IVsPackageUninstaller> _packageUninstaller;
public PackageServicesProxy(
IVsPackageInstallerServices packageInstallerServices,
IVsPackageInstaller2 packageInstaller,
IVsPackageUninstaller packageUninstaller,
IVsPackageSourceProvider packageSourceProvider)
Lazy<IVsPackageInstallerServices> packageInstallerServices,
Lazy<IVsPackageInstaller2> packageInstaller,
Lazy<IVsPackageUninstaller> packageUninstaller,
Lazy<IVsPackageSourceProvider> packageSourceProvider)
{
_packageInstallerServices = packageInstallerServices;
_packageInstaller = packageInstaller;
......@@ -680,36 +702,36 @@ private class PackageServicesProxy : IPackageServicesProxy
{
add
{
_packageSourceProvider.SourcesChanged += value;
_packageSourceProvider.Value.SourcesChanged += value;
}
remove
{
_packageSourceProvider.SourcesChanged -= value;
_packageSourceProvider.Value.SourcesChanged -= value;
}
}
public IEnumerable<PackageMetadata> GetInstalledPackages(EnvDTE.Project project)
{
return _packageInstallerServices.GetInstalledPackages(project)
return _packageInstallerServices.Value.GetInstalledPackages(project)
.Select(m => new PackageMetadata(m.Id, m.VersionString))
.ToList();
}
public bool IsPackageInstalled(EnvDTE.Project project, string id)
=> _packageInstallerServices.IsPackageInstalled(project, id);
=> _packageInstallerServices.Value.IsPackageInstalled(project, id);
public void InstallPackage(string source, EnvDTE.Project project, string packageId, string version, bool ignoreDependencies)
=> _packageInstaller.InstallPackage(source, project, packageId, version, ignoreDependencies);
=> _packageInstaller.Value.InstallPackage(source, project, packageId, version, ignoreDependencies);
public void InstallLatestPackage(string source, EnvDTE.Project project, string packageId, bool includePrerelease, bool ignoreDependencies)
=> _packageInstaller.InstallLatestPackage(source, project, packageId, includePrerelease, ignoreDependencies);
=> _packageInstaller.Value.InstallLatestPackage(source, project, packageId, includePrerelease, ignoreDependencies);
public IEnumerable<KeyValuePair<string, string>> GetSources(bool includeUnOfficial, bool includeDisabled)
=> _packageSourceProvider.GetSources(includeUnOfficial, includeDisabled);
=> _packageSourceProvider.Value.GetSources(includeUnOfficial, includeDisabled);
public void UninstallPackage(EnvDTE.Project project, string packageId, bool removeDependencies)
=> _packageUninstaller.UninstallPackage(project, packageId, removeDependencies);
=> _packageUninstaller.Value.UninstallPackage(project, packageId, removeDependencies);
}
}
}
......@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Host;
using Roslyn.Utilities;
......@@ -26,7 +27,8 @@ internal interface IPackageInstallerService : IWorkspaceService
void ShowManagePackagesDialog(string packageName);
ImmutableArray<PackageSource> PackageSources { get; }
ValueTask<ImmutableArray<PackageSource>> GetPackageSourcesAsync(CancellationToken cancellationToken);
event EventHandler PackageSourcesChanged;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册