-
Notifications
You must be signed in to change notification settings - Fork 752
Expand file tree
/
Copy pathLegacyPackageReferenceProjectProvider.cs
More file actions
124 lines (106 loc) · 5.01 KB
/
LegacyPackageReferenceProjectProvider.cs
File metadata and controls
124 lines (106 loc) · 5.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.ComponentModel.Composition;
using Microsoft;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Utilities;
using NuGet.Commands.Restore.Utility;
using NuGet.Common;
using NuGet.Frameworks;
using NuGet.ProjectManagement;
using NuGet.ProjectModel;
using NuGet.VisualStudio;
using VSLangProj150;
using IAsyncServiceProvider = Microsoft.VisualStudio.Shell.IAsyncServiceProvider;
namespace NuGet.PackageManagement.VisualStudio
{
[Export(typeof(INuGetProjectProvider))]
[Name(nameof(LegacyPackageReferenceProjectProvider))]
[Order(After = nameof(CpsPackageReferenceProjectProvider))]
public sealed class LegacyPackageReferenceProjectProvider : INuGetProjectProvider
{
private static readonly string PackageReference = ProjectStyle.PackageReference.ToString();
private readonly IVsProjectThreadingService _threadingService;
private readonly Lazy<IScriptExecutor> _scriptExecutor;
private readonly bool _usePackageSpecFactory;
public RuntimeTypeHandle ProjectType => typeof(LegacyPackageReferenceProject).TypeHandle;
[ImportingConstructor]
public LegacyPackageReferenceProjectProvider(
IVsProjectThreadingService threadingService,
Lazy<IScriptExecutor> scriptExecutor)
: this(AsyncServiceProvider.GlobalProvider,
threadingService,
scriptExecutor,
EnvironmentVariableWrapper.Instance)
{ }
public LegacyPackageReferenceProjectProvider(
IAsyncServiceProvider vsServiceProvider,
IVsProjectThreadingService threadingService,
Lazy<IScriptExecutor> scriptExecutor,
IEnvironmentVariableReader environmentVariableReader)
{
Assumes.Present(vsServiceProvider);
Assumes.Present(threadingService);
Assumes.Present(scriptExecutor);
Assumes.Present(environmentVariableReader);
_threadingService = threadingService;
_scriptExecutor = scriptExecutor;
_usePackageSpecFactory = !bool.FalseString.Equals(PackageSpecFactory.EnvironmentVariableName, StringComparison.OrdinalIgnoreCase);
}
public NuGetProject TryCreateNuGetProject(
IVsProjectAdapter vsProjectAdapter,
ProjectProviderContext _,
bool forceProjectType)
{
Assumes.Present(vsProjectAdapter);
ThreadHelper.ThrowIfNotOnUIThread();
var projectServices = TryCreateProjectServices(
vsProjectAdapter,
forceCreate: forceProjectType);
if (projectServices == null)
{
return null;
}
NuGetFramework targetFramework = vsProjectAdapter.GetTargetFramework();
return new LegacyPackageReferenceProject(
vsProjectAdapter,
vsProjectAdapter.ProjectId,
projectServices,
_threadingService,
targetFramework,
_usePackageSpecFactory);
}
/// <summary>
/// Is this project a non-CPS package reference based csproj?
/// </summary>
private VsManagedLanguagesProjectSystemServices TryCreateProjectServices(
IVsProjectAdapter vsProjectAdapter, bool forceCreate)
{
ThreadHelper.ThrowIfNotOnUIThread();
var vsProject4 = vsProjectAdapter.Project.Object as VSProject4;
// A legacy CSProj must cast to VSProject4 to manipulate package references
if (vsProject4 == null)
{
return null;
}
// Check for RestoreProjectStyle property
#pragma warning disable CS0618 // Type or member is obsolete
// Need to validate no project systems get this property via DTE, and if so, switch to GetPropertyValue
var restoreProjectStyle = vsProjectAdapter.BuildProperties.GetPropertyValueWithDteFallback(
ProjectBuildProperties.RestoreProjectStyle);
#pragma warning restore CS0618 // Type or member is obsolete
// For legacy csproj, either the RestoreProjectStyle must be set to PackageReference or
// project has atleast one package dependency defined as PackageReference
if (forceCreate
|| PackageReference.Equals(restoreProjectStyle, StringComparison.OrdinalIgnoreCase)
|| (vsProject4.PackageReferences?.InstalledPackages?.Length ?? 0) > 0)
{
var nominatesOnSolutionLoad = vsProjectAdapter.IsCapabilityMatch(NuGet.VisualStudio.IDE.ProjectCapabilities.PackageReferences);
return new VsManagedLanguagesProjectSystemServices(vsProjectAdapter, _threadingService, vsProject4, nominatesOnSolutionLoad, _scriptExecutor);
}
return null;
}
}
}