private async Task SetDefaultProjectNameAsync() { ThreadHelper.ThrowIfNotOnUIThread(); IEnumerable <object> startupProjects; try { // when a new solution opens, we set its startup project as the default project in NuGet Console var dte = await _asyncServiceProvider.GetDTEAsync(); var solutionBuild = dte.Solution.SolutionBuild as SolutionBuild2; startupProjects = solutionBuild?.StartupProjects as IEnumerable <object>; } catch (COMException) { // get_StartupProjects misbehaves for certain project types, so ignore this failure return; } var startupProjectName = startupProjects?.Cast <string>().FirstOrDefault(); if (!string.IsNullOrEmpty(startupProjectName)) { if (_projectSystemCache.TryGetProjectNames(startupProjectName, out var projectName)) { DefaultNuGetProjectName = _projectSystemCache.IsAmbiguous(projectName.ShortName) ? projectName.CustomUniqueName : projectName.ShortName; } } }
public async Task <bool> NominateProjectAsync(string projectUniqueName, CancellationToken token) { Assumes.NotNullOrEmpty(projectUniqueName); if (!_projectSystemCache.TryGetProjectNames(projectUniqueName, out ProjectNames projectNames)) { IVsSolution2 vsSolution2 = await _vsSolution2.GetValueAsync(token); projectNames = await ProjectNames.FromIVsSolution2(projectUniqueName, vsSolution2, token); } var dgSpec = new DependencyGraphSpec(); var packageSpec = new PackageSpec() { Name = projectUniqueName }; dgSpec.AddProject(packageSpec); dgSpec.AddRestore(packageSpec.Name); _projectSystemCache.AddProjectRestoreInfo(projectNames, dgSpec, new List <IAssetsLogMessage>()); // returned task completes when scheduled restore operation completes. var restoreTask = _restoreWorker.ScheduleRestoreAsync( SolutionRestoreRequest.OnUpdate(), token); return(await restoreTask); }
public async Task <NuGetProject> UpdateNuGetProjectToPackageRef(NuGetProject oldProject) { #if VS14 // do nothing for VS 2015 and simply return the existing NuGetProject if (NuGetProjectUpdated != null) { NuGetProjectUpdated(this, new NuGetProjectEventArgs(oldProject)); } return(await Task.FromResult(oldProject)); #else if (oldProject == null) { throw new ArgumentException( Strings.Argument_Cannot_Be_Null_Or_Empty, nameof(oldProject)); } var projectName = GetNuGetProjectSafeName(oldProject); var dteProject = GetDTEProject(projectName); ProjectNames oldEnvDTEProjectName; _projectSystemCache.TryGetProjectNames(projectName, out oldEnvDTEProjectName); RemoveEnvDTEProjectFromCache(projectName); var nuGetProject = await NuGetUIThreadHelper.JoinableTaskFactory.RunAsync(async() => { await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); var settings = ServiceLocator.GetInstance <ISettings>(); var context = new ProjectSystemProviderContext( EmptyNuGetProjectContext, () => PackagesFolderPathUtility.GetPackagesFolderPath(this, settings)); return(new LegacyCSProjPackageReferenceProject( new EnvDTEProjectAdapter(dteProject), VsHierarchyUtility.GetProjectId(dteProject))); }); var added = _projectSystemCache.AddProject(oldEnvDTEProjectName, dteProject, nuGetProject); if (DefaultNuGetProjectName == null) { DefaultNuGetProjectName = projectName; } if (NuGetProjectUpdated != null) { NuGetProjectUpdated(this, new NuGetProjectEventArgs(nuGetProject)); } return(nuGetProject); #endif }
private void SetDefaultProjectName() { ThreadHelper.ThrowIfNotOnUIThread(); // when a new solution opens, we set its startup project as the default project in NuGet Console var dte = _serviceProvider.GetDTE(); var solutionBuild = (SolutionBuild2)dte.Solution.SolutionBuild; if (solutionBuild.StartupProjects != null) { var startupProjects = (IEnumerable <object>)solutionBuild.StartupProjects; var startupProjectName = startupProjects.Cast <string>().FirstOrDefault(); if (!string.IsNullOrEmpty(startupProjectName)) { if (_projectSystemCache.TryGetProjectNames(startupProjectName, out ProjectNames projectName)) { DefaultNuGetProjectName = _projectSystemCache.IsAmbiguous(projectName.ShortName) ? projectName.CustomUniqueName : projectName.ShortName; } } } }
/// <summary> /// This is where the nominate calls for the IVs1 and IVS3 APIs combine. The reason for this method is to avoid duplication and potential issues /// The issue with this method is that it has some weird custom logging to ensure backward compatibility. It's on the implementer to ensure these calls are correct. /// <param name="projectUniqueName">projectUniqueName</param> /// <param name="projectRestoreInfo">projectRestoreInfo. Can be null</param> /// <param name="projectRestoreInfo2">proectRestoreInfo2. Can be null</param> /// <param name="token"></param> /// <remarks>Exactly one of projectRestoreInfos has to null.</remarks> /// <returns>The task that scheduled restore</returns> private async Task <bool> NominateProjectAsync(string projectUniqueName, IVsProjectRestoreInfo projectRestoreInfo, IVsProjectRestoreInfo2 projectRestoreInfo2, CancellationToken token) { if (string.IsNullOrEmpty(projectUniqueName)) { throw new ArgumentException(Resources.Argument_Cannot_Be_Null_Or_Empty, nameof(projectUniqueName)); } if (projectRestoreInfo == null && projectRestoreInfo2 == null) { throw new ArgumentNullException(nameof(projectRestoreInfo)); } if (projectRestoreInfo != null && projectRestoreInfo2 != null) { throw new ArgumentException($"Internal error: Both {nameof(projectRestoreInfo)} and {nameof(projectRestoreInfo2)} cannot have values. Please file an issue at NuGet/Home if you see this exception."); } if (projectRestoreInfo != null) { if (projectRestoreInfo.TargetFrameworks == null) { throw new InvalidOperationException("TargetFrameworks cannot be null."); } } else { if (projectRestoreInfo2.TargetFrameworks == null) { throw new InvalidOperationException("TargetFrameworks cannot be null."); } } try { _logger.LogInformation( $"The nominate API is called for '{projectUniqueName}'."); if (!_projectSystemCache.TryGetProjectNames(projectUniqueName, out ProjectNames projectNames)) { IVsSolution2 vsSolution2 = await _vsSolution2.GetValueAsync(token); projectNames = await ProjectNames.FromIVsSolution2(projectUniqueName, vsSolution2, token); } DependencyGraphSpec dgSpec; IReadOnlyList <IAssetsLogMessage> nominationErrors = null; try { dgSpec = ToDependencyGraphSpec(projectNames, projectRestoreInfo, projectRestoreInfo2); } catch (Exception e) { var restoreLogMessage = RestoreLogMessage.CreateError(NuGetLogCode.NU1105, string.Format(Resources.NU1105, projectNames.ShortName, e.Message)); restoreLogMessage.LibraryId = projectUniqueName; nominationErrors = new List <IAssetsLogMessage>() { AssetsLogMessage.Create(restoreLogMessage) }; var projectDirectory = Path.GetDirectoryName(projectUniqueName); string projectIntermediatePath = projectRestoreInfo == null ? projectRestoreInfo2.BaseIntermediatePath : projectRestoreInfo.BaseIntermediatePath; var dgSpecOutputPath = GetProjectOutputPath(projectDirectory, projectIntermediatePath); dgSpec = CreateMinimalDependencyGraphSpec(projectUniqueName, dgSpecOutputPath); } _projectSystemCache.AddProjectRestoreInfo(projectNames, dgSpec, nominationErrors); // returned task completes when scheduled restore operation completes. var restoreTask = _restoreWorker.ScheduleRestoreAsync( SolutionRestoreRequest.OnUpdate(), token); return(await restoreTask); } catch (OperationCanceledException) { throw; } catch (Exception e) { _logger.LogError(e.ToString()); TelemetryUtility.EmitException(nameof(VsSolutionRestoreService), nameof(NominateProjectAsync), e); return(false); } }