private static async Task <NuGetFramework> GetNuGetFramework( IDeferredProjectWorkspaceService deferredWorkspaceService, IMSBuildProjectDataService dataService, string projectPath) { var targetPlatformIdentifier = await deferredWorkspaceService.GetProjectPropertyAsync(dataService, TargetPlatformIdentifier); var targetPlatformVersion = await deferredWorkspaceService.GetProjectPropertyAsync(dataService, TargetPlatformVersion); var targetPlatformMinVersion = await deferredWorkspaceService.GetProjectPropertyAsync(dataService, TargetPlatformMinVersion); var targetFrameworkMoniker = await deferredWorkspaceService.GetProjectPropertyAsync(dataService, TargetFrameworkMoniker); var frameworkStrings = MSBuildProjectFrameworkUtility.GetProjectFrameworkStrings( projectFilePath: projectPath, targetFrameworks: null, targetFramework: null, targetFrameworkMoniker: targetFrameworkMoniker, targetPlatformIdentifier: targetPlatformIdentifier, targetPlatformVersion: targetPlatformVersion, targetPlatformMinVersion: targetPlatformMinVersion); var frameworkString = frameworkStrings.FirstOrDefault(); if (!string.IsNullOrEmpty(frameworkString)) { return(NuGetFramework.Parse(frameworkString)); } return(NuGetFramework.UnsupportedFramework); }
private static async Task <List <NuGetFramework> > GetNuGetFrameworks( IDeferredProjectWorkspaceService deferredWorkspaceService, IMSBuildProjectDataService dataService, string projectPath) { var targetFrameworks = await deferredWorkspaceService.GetProjectPropertyAsync(dataService, TargetFrameworks); if (!string.IsNullOrEmpty(targetFrameworks)) { return(targetFrameworks .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(NuGetFramework.Parse).ToList()); } var targetFramework = await deferredWorkspaceService.GetProjectPropertyAsync(dataService, TargetFramework); if (!string.IsNullOrEmpty(targetFramework)) { return(new List <NuGetFramework> { NuGetFramework.Parse(targetFramework) }); } // old packages.config style or legacy PackageRef return(new List <NuGetFramework> { await GetNuGetFramework(deferredWorkspaceService, dataService, projectPath) }); }
private static async Task <string> GetProjectPropertyOrDefault( IDeferredProjectWorkspaceService deferredWorkspaceService, IMSBuildProjectDataService dataService, string projectPropertyName, string defaultValue = "") { var propertyValue = await deferredWorkspaceService.GetProjectPropertyAsync(dataService, projectPropertyName); if (!string.IsNullOrEmpty(propertyValue)) { return(propertyValue); } return(defaultValue); }
private static async Task <PackageSpec> GetPackageSpecForPackageReferencesAsync( IDeferredProjectWorkspaceService deferredWorkspaceService, string projectPath) { var projectName = Path.GetFileNameWithoutExtension(projectPath); var projectDirectory = Path.GetDirectoryName(projectPath); var msbuildProjectDataService = await deferredWorkspaceService.GetMSBuildProjectDataService(projectPath); var packageReferences = (await deferredWorkspaceService.GetProjectItemsAsync(msbuildProjectDataService, PackageReference)).ToList(); if (packageReferences.Count == 0) { return(null); } var targetFrameworks = await GetNuGetFrameworks(deferredWorkspaceService, msbuildProjectDataService, projectPath); if (targetFrameworks.Count == 0) { return(null); } var outputPath = Path.GetFullPath( Path.Combine( projectDirectory, await GetProjectPropertyOrDefault(deferredWorkspaceService, msbuildProjectDataService, BaseIntermediateOutputPath))); var crossTargeting = targetFrameworks.Count > 1; var tfis = new List <TargetFrameworkInformation>(); var projectsByFramework = new Dictionary <NuGetFramework, IEnumerable <ProjectRestoreReference> >(); var runtimes = new List <string>(); var supports = new List <string>(); foreach (var targetFramework in targetFrameworks) { var tfi = new TargetFrameworkInformation { FrameworkName = targetFramework }; // re-evaluate msbuild project data service if there are multi-targets if (targetFrameworks.Count > 1) { msbuildProjectDataService = await deferredWorkspaceService.GetMSBuildProjectDataService( projectPath, targetFramework.GetShortFolderName()); packageReferences = (await deferredWorkspaceService.GetProjectItemsAsync(msbuildProjectDataService, PackageReference)).ToList(); } // Package target fallback per target framework var ptf = await deferredWorkspaceService.GetProjectPropertyAsync(msbuildProjectDataService, PackageTargetFallback); if (!string.IsNullOrEmpty(ptf)) { var fallBackList = ptf.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(NuGetFramework.Parse).ToList(); if (fallBackList.Count > 0) { tfi.FrameworkName = new FallbackFramework(tfi.FrameworkName, fallBackList); } tfi.Imports = fallBackList; } // package references per target framework tfi.Dependencies.AddRange( packageReferences.Select(ToPackageLibraryDependency)); // Project references per target framework var projectReferences = (await deferredWorkspaceService.GetProjectItemsAsync(msbuildProjectDataService, ProjectReference)) .Select(item => ToProjectRestoreReference(item, projectDirectory)); projectsByFramework.Add(tfi.FrameworkName, projectReferences); // Runtimes, Supports per target framework runtimes.AddRange(await GetRuntimeIdentifiers(deferredWorkspaceService, msbuildProjectDataService)); supports.AddRange(await GetRuntimeSupports(deferredWorkspaceService, msbuildProjectDataService)); tfis.Add(tfi); } var packageSpec = new PackageSpec(tfis) { Name = projectName, FilePath = projectPath, RestoreMetadata = new ProjectRestoreMetadata { ProjectName = projectName, ProjectUniqueName = projectPath, ProjectPath = projectPath, OutputPath = outputPath, ProjectStyle = ProjectStyle.PackageReference, TargetFrameworks = (projectsByFramework.Select( kvp => new ProjectRestoreMetadataFrameworkInfo(kvp.Key) { ProjectReferences = kvp.Value?.ToList() } )).ToList(), OriginalTargetFrameworks = tfis .Select(tf => tf.FrameworkName.GetShortFolderName()) .ToList(), CrossTargeting = crossTargeting }, RuntimeGraph = new RuntimeGraph( runtimes.Distinct(StringComparer.Ordinal).Select(rid => new RuntimeDescription(rid)), supports.Distinct(StringComparer.Ordinal).Select(s => new CompatibilityProfile(s))) }; return(packageSpec); }