private static void AddContentFiles(RestoreTargetGraph targetGraph, LockFileTargetLibrary lockFileLib, NuGetFramework framework, ContentItemCollection contentItems, NuspecReader nuspec) { // content v2 items var contentFileGroups = contentItems.FindItemGroups(targetGraph.Conventions.Patterns.ContentFiles); // Multiple groups can match the same framework, find all of them var contentFileGroupsForFramework = ContentFileUtils.GetContentGroupsForFramework( lockFileLib, framework, contentFileGroups); lockFileLib.ContentFiles = ContentFileUtils.GetContentFileGroup( framework, nuspec, contentFileGroupsForFramework); }
private static void AddContentFiles(ManagedCodeConventions managedCodeConventions, LockFileTargetLibrary lockFileLib, NuGetFramework framework, ContentItemCollection contentItems, NuspecReader nuspec) { // content v2 items List <ContentItemGroup> contentFileGroups = new(); contentItems.PopulateItemGroups(managedCodeConventions.Patterns.ContentFiles, contentFileGroups); if (contentFileGroups.Count > 0) { // Multiple groups can match the same framework, find all of them var contentFileGroupsForFramework = ContentFileUtils.GetContentGroupsForFramework( framework, contentFileGroups); lockFileLib.ContentFiles = ContentFileUtils.GetContentFileGroup( nuspec, contentFileGroupsForFramework); } }
public static LockFileTargetLibrary CreateLockFileTargetLibrary( LockFileLibrary library, LocalPackageInfo package, RestoreTargetGraph targetGraph, LibraryIncludeFlags dependencyType, NuGetFramework targetFrameworkOverride, IEnumerable <LibraryDependency> dependencies) { var lockFileLib = new LockFileTargetLibrary(); var framework = targetFrameworkOverride ?? targetGraph.Framework; var runtimeIdentifier = targetGraph.RuntimeIdentifier; lockFileLib.Name = package.Id; lockFileLib.Version = package.Version; lockFileLib.Type = LibraryType.Package; IList <string> files; var contentItems = new ContentItemCollection(); HashSet <string> referenceFilter = null; // If the previous LockFileLibrary was given, use that to find the file list. Otherwise read the nupkg. if (library == null) { using (var packageReader = new PackageFolderReader(package.ExpandedPath)) { if (Path.DirectorySeparatorChar != LockFile.DirectorySeparatorChar) { files = packageReader .GetFiles() .Select(p => p.Replace(Path.DirectorySeparatorChar, LockFile.DirectorySeparatorChar)) .ToList(); } else { files = packageReader .GetFiles() .ToList(); } } } else { if (Path.DirectorySeparatorChar != LockFile.DirectorySeparatorChar) { files = library.Files.Select(p => p.Replace(Path.DirectorySeparatorChar, LockFile.DirectorySeparatorChar)).ToList(); } else { files = library.Files; } } contentItems.Load(files); // This will throw an appropriate error if the nuspec is missing var nuspec = package.Nuspec; if (dependencies == null) { var dependencySet = nuspec .GetDependencyGroups() .GetNearest(framework); if (dependencySet != null) { var set = dependencySet.Packages; if (set != null) { lockFileLib.Dependencies = set.ToList(); } } } else { // Filter the dependency set down to packages and projects. // Framework references will not be displayed lockFileLib.Dependencies = dependencies .Where(ld => ld.LibraryRange.TypeConstraintAllowsAnyOf(LibraryDependencyTarget.PackageProjectExternal)) .Select(ld => new PackageDependency(ld.Name, ld.LibraryRange.VersionRange)) .ToList(); } var referenceSet = nuspec.GetReferenceGroups().GetNearest(framework); if (referenceSet != null) { referenceFilter = new HashSet <string>(referenceSet.Items, StringComparer.OrdinalIgnoreCase); } // Exclude framework references for package based frameworks. if (!framework.IsPackageBased) { var frameworkAssemblies = nuspec.GetFrameworkReferenceGroups().GetNearest(framework); if (frameworkAssemblies != null) { foreach (var assemblyReference in frameworkAssemblies.Items) { lockFileLib.FrameworkAssemblies.Add(assemblyReference); } } } // Create an ordered list of selection criteria. Each will be applied, if the result is empty // fallback frameworks from "imports" will be tried. // These are only used for framework/RID combinations where content model handles everything. var orderedCriteria = CreateCriteria(targetGraph, framework); // Compile var compileGroup = GetLockFileItems( orderedCriteria, contentItems, targetGraph.Conventions.Patterns.CompileAssemblies, targetGraph.Conventions.Patterns.RuntimeAssemblies); lockFileLib.CompileTimeAssemblies.AddRange(compileGroup); // Runtime var runtimeGroup = GetLockFileItems( orderedCriteria, contentItems, targetGraph.Conventions.Patterns.RuntimeAssemblies); lockFileLib.RuntimeAssemblies.AddRange(runtimeGroup); // Resources var resourceGroup = GetLockFileItems( orderedCriteria, contentItems, targetGraph.Conventions.Patterns.ResourceAssemblies); lockFileLib.ResourceAssemblies.AddRange(resourceGroup); // Native var nativeGroup = GetLockFileItems( orderedCriteria, contentItems, targetGraph.Conventions.Patterns.NativeLibraries); lockFileLib.NativeLibraries.AddRange(nativeGroup); // content v2 items var contentFileGroups = contentItems.FindItemGroups(targetGraph.Conventions.Patterns.ContentFiles); // Multiple groups can match the same framework, find all of them var contentFileGroupsForFramework = ContentFileUtils.GetContentGroupsForFramework( lockFileLib, framework, contentFileGroups); lockFileLib.ContentFiles = ContentFileUtils.GetContentFileGroup( framework, nuspec, contentFileGroupsForFramework); // Runtime targets // These are applied only to non-RID target graphs. // They are not used for compatibility checks. if (string.IsNullOrEmpty(runtimeIdentifier)) { // Runtime targets contain all the runtime specific assets // that could be contained in the runtime specific target graphs. // These items are contained in a flat list and have additional properties // for the RID and lock file section the assembly would belong to. var runtimeTargetItems = new List <LockFileRuntimeTarget>(); // Runtime runtimeTargetItems.AddRange(GetRuntimeTargetLockFileItems( contentItems, framework, dependencyType, LibraryIncludeFlags.Runtime, targetGraph.Conventions.Patterns.RuntimeAssemblies, "runtime")); // Resource runtimeTargetItems.AddRange(GetRuntimeTargetLockFileItems( contentItems, framework, dependencyType, LibraryIncludeFlags.Runtime, targetGraph.Conventions.Patterns.ResourceAssemblies, "resource")); // Native runtimeTargetItems.AddRange(GetRuntimeTargetLockFileItems( contentItems, framework, dependencyType, LibraryIncludeFlags.Native, targetGraph.Conventions.Patterns.NativeLibraries, "native")); lockFileLib.RuntimeTargets = runtimeTargetItems; } // COMPAT: Support lib/contract so older packages can be consumed var contractPath = "lib/contract/" + package.Id + ".dll"; var hasContract = files.Any(path => path == contractPath); var hasLib = lockFileLib.RuntimeAssemblies.Any(); if (hasContract && hasLib && !framework.IsDesktop()) { lockFileLib.CompileTimeAssemblies.Clear(); lockFileLib.CompileTimeAssemblies.Add(new LockFileItem(contractPath)); } // Apply filters from the <references> node in the nuspec if (referenceFilter != null) { // Remove anything that starts with "lib/" and is NOT specified in the reference filter. // runtimes/* is unaffected (it doesn't start with lib/) lockFileLib.RuntimeAssemblies = lockFileLib.RuntimeAssemblies.Where(p => !p.Path.StartsWith("lib/") || referenceFilter.Contains(Path.GetFileName(p.Path))).ToList(); lockFileLib.CompileTimeAssemblies = lockFileLib.CompileTimeAssemblies.Where(p => !p.Path.StartsWith("lib/") || referenceFilter.Contains(Path.GetFileName(p.Path))).ToList(); } // Exclude items if ((dependencyType & LibraryIncludeFlags.Runtime) == LibraryIncludeFlags.None) { ClearIfExists(lockFileLib.RuntimeAssemblies); lockFileLib.FrameworkAssemblies.Clear(); lockFileLib.ResourceAssemblies.Clear(); } if ((dependencyType & LibraryIncludeFlags.Compile) == LibraryIncludeFlags.None) { ClearIfExists(lockFileLib.CompileTimeAssemblies); } if ((dependencyType & LibraryIncludeFlags.Native) == LibraryIncludeFlags.None) { ClearIfExists(lockFileLib.NativeLibraries); } if ((dependencyType & LibraryIncludeFlags.ContentFiles) == LibraryIncludeFlags.None && GroupHasNonEmptyItems(lockFileLib.ContentFiles)) { // Empty lock file items still need lock file properties for language, action, and output. lockFileLib.ContentFiles.Clear(); lockFileLib.ContentFiles.Add(ContentFileUtils.CreateEmptyItem()); } return(lockFileLib); }