Beispiel #1
0
        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);
        }
Beispiel #2
0
        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)
            });
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }