Beispiel #1
0
        private static async Task <PackageSpec> GetPackageSpecForPackagesConfigAsync(IDeferredProjectWorkspaceService deferredWorkspaceService, string projectPath)
        {
            var projectName = Path.GetFileNameWithoutExtension(projectPath);

            var msbuildProjectDataService = await deferredWorkspaceService.GetMSBuildProjectDataService(projectPath);

            var nuGetFramework = await GetNuGetFramework(deferredWorkspaceService, msbuildProjectDataService, projectPath);

            var packageSpec = new PackageSpec(
                new List <TargetFrameworkInformation>
            {
                new TargetFrameworkInformation
                {
                    FrameworkName = nuGetFramework
                }
            });

            packageSpec.Name     = projectName;
            packageSpec.FilePath = projectPath;

            var metadata = new ProjectRestoreMetadata();

            packageSpec.RestoreMetadata = metadata;

            metadata.ProjectStyle      = ProjectStyle.PackagesConfig;
            metadata.ProjectPath       = projectPath;
            metadata.ProjectName       = projectName;
            metadata.ProjectUniqueName = projectPath;
            metadata.TargetFrameworks.Add(new ProjectRestoreMetadataFrameworkInfo(nuGetFramework));

            await AddProjectReferencesAsync(deferredWorkspaceService, metadata, projectPath);

            return(packageSpec);
        }
Beispiel #2
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);
        }