private bool IsPackageCompatible(CompatibilityData compatibilityData)
 {
     // A package is compatible if it has...
     return
         (HasCompatibleAssets(compatibilityData.TargetLibrary) ||
          !compatibilityData.Files.Any(p =>
                                       p.StartsWith("ref/", StringComparison.OrdinalIgnoreCase) ||
                                       p.StartsWith("lib/", StringComparison.OrdinalIgnoreCase))); // No assemblies at all (for any TxM)
 }
Example #2
0
 private bool IsCompatible(CompatibilityData compatibilityData)
 {
     // A package is compatible if it has...
     return
         (compatibilityData.TargetLibrary.RuntimeAssemblies.Count > 0 ||                         // Runtime Assemblies, or
          compatibilityData.TargetLibrary.CompileTimeAssemblies.Count > 0 ||                     // Compile-time Assemblies, or
          compatibilityData.TargetLibrary.FrameworkAssemblies.Count > 0 ||                       // Framework Assemblies, or
          compatibilityData.TargetLibrary.ContentFiles.Count > 0 ||                              // Shared content
          compatibilityData.TargetLibrary.ResourceAssemblies.Count > 0 ||                        // Resources (satellite package)
          !compatibilityData.Files.Any(p =>
                                       p.StartsWith("ref/", StringComparison.OrdinalIgnoreCase) ||
                                       p.StartsWith("lib/", StringComparison.OrdinalIgnoreCase))); // No assemblies at all (for any TxM)
 }
        private static IEnumerable <NuGetFramework> GetPackageFrameworks(
            CompatibilityData compatibilityData,
            RestoreTargetGraph graph)
        {
            var available = new HashSet <NuGetFramework>();

            var contentItems = new ContentItemCollection();

            contentItems.Load(compatibilityData.Files);

            var patterns = new[]
            {
                graph.Conventions.Patterns.ResourceAssemblies,
                graph.Conventions.Patterns.CompileRefAssemblies,
                graph.Conventions.Patterns.RuntimeAssemblies,
                graph.Conventions.Patterns.EmbedAssemblies,
                graph.Conventions.Patterns.ContentFiles
            };

            List <ContentItemGroup> itemGroups = new();

            foreach (var pattern in patterns)
            {
                itemGroups.Clear();
                contentItems.PopulateItemGroups(pattern, itemGroups);
                foreach (var group in itemGroups)
                {
                    // lib/net45/subfolder/a.dll will be returned as a group with zero items since sub
                    // folders are not allowed. Completely empty groups are not compatible, a group with
                    // _._ would contain _._ as an item.
                    if (group.Items.Count > 0)
                    {
                        group.Properties.TryGetValue(ManagedCodeConventions.PropertyNames.RuntimeIdentifier, out var ridObj);
                        group.Properties.TryGetValue(ManagedCodeConventions.PropertyNames.TargetFrameworkMoniker, out var tfmObj);

                        var tfm = tfmObj as NuGetFramework;

                        // RID specific items should be ignored here since they are only used in the runtime assembly check
                        if (ridObj == null && tfm?.IsSpecificFramework == true)
                        {
                            available.Add(tfm);
                        }
                    }
                }
            }

            return(available);
        }
        private async Task VerifyDotnetToolCompatibilityChecks(CompatibilityData compatibilityData, GraphItem <RemoteResolveResult> node, RestoreTargetGraph graph, List <CompatibilityIssue> issues)
        {
            var containsDotnetToolPackageType = compatibilityData.TargetLibrary.PackageType.Contains(PackageType.DotnetTool);

            if (compatibilityData.TargetLibrary.PackageType.Count != 1 && containsDotnetToolPackageType)
            {
                var issue = CompatibilityIssue.ToolsPackageWithExtraPackageTypes(
                    new PackageIdentity(node.Key.Name, node.Key.Version));

                issues.Add(issue);
                await _log.LogAsync(GetErrorMessage(NuGetLogCode.NU1204, issue, graph));
            }

            if (containsDotnetToolPackageType &&
                !(HasCompatibleToolsAssets(compatibilityData.TargetLibrary) || !compatibilityData.Files.Any(p => p.StartsWith("tools/", StringComparison.OrdinalIgnoreCase))))
            {
                var available = GetAvailableFrameworkRuntimePairs(compatibilityData, graph);
                var issue     = CompatibilityIssue.IncompatibleToolsPackage(
                    new PackageIdentity(node.Key.Name, node.Key.Version),
                    graph.Framework,
                    graph.RuntimeIdentifier,
                    available);

                issues.Add(issue);
                await _log.LogAsync(GetErrorMessage(NuGetLogCode.NU1202, issue, graph));
            }

            if (ProjectStyle.DotnetToolReference == compatibilityData.PackageSpec.RestoreMetadata?.ProjectStyle)
            {
                // If the package is not autoreferenced or a tool package
                if (!containsDotnetToolPackageType && compatibilityData.PackageSpec.GetAllPackageDependencies().Where(e => !e.AutoReferenced).Any(e => e.Name.Equals(compatibilityData.TargetLibrary.Name, StringComparison.OrdinalIgnoreCase)))
                {
                    var issue = CompatibilityIssue.IncompatiblePackageWithDotnetTool(new PackageIdentity(node.Key.Name, node.Key.Version));
                    issues.Add(issue);
                    await _log.LogAsync(GetErrorMessage(NuGetLogCode.NU1212, issue, graph));
                }
            }
            else
            {
                if (containsDotnetToolPackageType)
                {
                    var issue = CompatibilityIssue.IncompatiblePackageWithDotnetTool(new PackageIdentity(node.Key.Name, node.Key.Version));
                    issues.Add(issue);
                    await _log.LogAsync(GetErrorMessage(NuGetLogCode.NU1212, issue, graph));
                }
            }
        }
Example #5
0
        private static List <NuGetFramework> GetPackageFrameworks(
            CompatibilityData compatibilityData,
            RestoreTargetGraph graph)
        {
            var available = new HashSet <NuGetFramework>();

            var contentItems = new ContentItemCollection();

            contentItems.Load(compatibilityData.Files);

            var patterns = new[]
            {
                graph.Conventions.Patterns.ResourceAssemblies,
                graph.Conventions.Patterns.CompileRefAssemblies,
                graph.Conventions.Patterns.RuntimeAssemblies,
                graph.Conventions.Patterns.ContentFiles
            };

            foreach (var pattern in patterns)
            {
                foreach (var group in contentItems.FindItemGroups(pattern))
                {
                    object tfmObj = null;
                    object ridObj = null;
                    group.Properties.TryGetValue(ManagedCodeConventions.PropertyNames.RuntimeIdentifier, out ridObj);
                    group.Properties.TryGetValue(ManagedCodeConventions.PropertyNames.TargetFrameworkMoniker, out tfmObj);

                    NuGetFramework tfm = tfmObj as NuGetFramework;

                    // RID specific items should be ignored here since they are only used in the runtime assem check
                    if (ridObj == null && tfm?.IsSpecificFramework == true)
                    {
                        available.Add(tfm);
                    }
                }
            }

            return(available.ToList());
        }
        private static HashSet <FrameworkRuntimePair> GetAvailableFrameworkRuntimePairs(CompatibilityData compatibilityData, RestoreTargetGraph graph)
        {
            var available = new HashSet <FrameworkRuntimePair>();

            var contentItems = new ContentItemCollection();

            contentItems.Load(compatibilityData.Files);


            if (compatibilityData.TargetLibrary.PackageType.Contains(PackageType.DotnetTool))
            {
                foreach (var group in contentItems.FindItemGroups(graph.Conventions.Patterns.ToolsAssemblies))
                {
                    group.Properties.TryGetValue(ManagedCodeConventions.PropertyNames.RuntimeIdentifier, out var ridObj);
                    group.Properties.TryGetValue(ManagedCodeConventions.PropertyNames.TargetFrameworkMoniker, out var tfmObj);

                    var tfm = tfmObj as NuGetFramework;
                    var rid = ridObj as string;
                    if (tfm?.IsSpecificFramework == true)
                    {
                        available.Add(new FrameworkRuntimePair(tfm, rid));
                    }
                }
            }

            return(available);
        }
Example #7
0
 /// <summary>
 /// Whether a package has an incompatible package type. Currently, only 1 package type is incompatible in every project graph and that's DotnetPlatform.
 /// </summary>
 /// <param name="compatibilityData"></param>
 private bool IsPackageTypeCompatible(CompatibilityData compatibilityData)
 {
     // A package is compatible if it is not DotnetPlatform package type
     return(!compatibilityData.TargetLibrary.PackageType.Contains(PackageType.DotnetPlatform));
 }