public PackageDescription GetDescription(LockFilePackageLibrary package, LockFileTargetLibrary targetLibrary) { // If a NuGet dependency is supposed to provide assemblies but there is no assembly compatible with // current target framework, we should mark this dependency as unresolved var containsAssembly = package.Files .Any(x => x.StartsWith($"ref{Path.DirectorySeparatorChar}") || x.StartsWith($"lib{Path.DirectorySeparatorChar}")); var compatible = targetLibrary.FrameworkAssemblies.Any() || targetLibrary.CompileTimeAssemblies.Any() || targetLibrary.RuntimeAssemblies.Any() || !containsAssembly; var resolved = compatible; var dependencies = new List <LibraryDependency>(targetLibrary.Dependencies.Count + targetLibrary.FrameworkAssemblies.Count); PopulateDependencies(dependencies, targetLibrary); var packageDescription = new PackageDescription( new LibraryRange(package.Name, frameworkReference: false) { VersionRange = new SemanticVersionRange(package.Version) }, package, targetLibrary, dependencies, resolved, compatible); Initialize(packageDescription); return(packageDescription); }
public PackageInfo( IFileSystem repositoryRoot, string packageId, SemanticVersion version, string versionDir, LockFilePackageLibrary lockFileLibrary = null) { _repositoryRoot = repositoryRoot; Id = packageId; Version = version; _versionDir = versionDir; LockFileLibrary = lockFileLibrary; }
public static LockFilePackageLibrary CreateLockFilePackageLibrary(LockFilePackageLibrary previousLibrary, IPackagePathResolver resolver, IPackage package, string correctedPackageName = null) { var lockFileLib = new LockFilePackageLibrary(); // package.Id is read from nuspec and it might be in wrong casing. // correctedPackageName should be the package name used by dependency graph and // it has the correct casing that runtime needs during dependency resolution. lockFileLib.Name = correctedPackageName ?? package.Id; lockFileLib.Version = package.Version; lockFileLib.Sha512 = File.ReadAllText(resolver.GetHashPath(package.Id, package.Version)); // If the shas are equal then do nothing if (previousLibrary?.Sha512 == lockFileLib.Sha512) { lockFileLib.Files = previousLibrary.Files; lockFileLib.IsServiceable = previousLibrary.IsServiceable; } else { lockFileLib.Files = package.GetFiles().Select(p => p.Path).ToList(); var installPath = resolver.GetInstallPath(package.Id, package.Version); foreach (var filePath in lockFileLib.Files) { if (!string.Equals(Path.GetExtension(filePath), ".dll", StringComparison.OrdinalIgnoreCase)) { continue; } var assemblyPath = Path.Combine(installPath, filePath); try { if (IsAssemblyServiceable(assemblyPath)) { lockFileLib.IsServiceable = true; break; } } catch { // Just move on to the next file } } } return lockFileLib; }
public PackageDescription( LibraryRange requestedRange, LockFilePackageLibrary package, LockFileTargetLibrary lockFileLibrary, IEnumerable<LibraryDependency> dependencies, bool resolved, bool compatible) : base(requestedRange, new LibraryIdentity(package.Name, package.Version, isGacOrFrameworkReference: false), path: null, type: LibraryTypes.Package, dependencies: dependencies, assemblies: Enumerable.Empty<string>(), framework: null) { Library = package; Target = lockFileLibrary; Resolved = resolved; Compatible = compatible; }
public PackageDescription( LibraryRange requestedRange, LockFilePackageLibrary package, LockFileTargetLibrary lockFileLibrary, IEnumerable <LibraryDependency> dependencies, bool resolved, bool compatible) : base( requestedRange, new LibraryIdentity(package.Name, package.Version, isGacOrFrameworkReference: false), path: null, type: LibraryTypes.Package, dependencies: dependencies, assemblies: Enumerable.Empty <string>(), framework: null) { Library = package; Target = lockFileLibrary; Resolved = resolved; Compatible = compatible; }
public static LockFileTargetLibrary CreateLockFileTargetLibrary(LockFilePackageLibrary library, IPackage package, RestoreContext context, string correctedPackageName) { var lockFileLib = new LockFileTargetLibrary { Type = "package" }; var framework = context.FrameworkName; var runtimeIdentifier = context.RuntimeName; // package.Id is read from nuspec and it might be in wrong casing. // correctedPackageName should be the package name used by dependency graph and // it has the correct casing that runtime needs during dependency resolution. lockFileLib.Name = correctedPackageName ?? package.Id; lockFileLib.Version = package.Version; var files = library.Files.Select(p => p.Replace(Path.DirectorySeparatorChar, '/')); var contentItems = new ContentItemCollection(); contentItems.Load(files); IEnumerable<PackageDependencySet> dependencySet; if (VersionUtility.GetNearest(framework, package.DependencySets, out dependencySet)) { var set = dependencySet.FirstOrDefault()?.Dependencies?.ToList(); if (set != null) { lockFileLib.Dependencies = set; } } // TODO: Remove this when we do #596 // ASP.NET Core and .NET Core 5.0 don't have framework reference assemblies if (!VersionUtility.IsPackageBased(framework)) { IEnumerable<FrameworkAssemblyReference> frameworkAssemblies; if (VersionUtility.GetNearest(framework, package.FrameworkAssemblies, out frameworkAssemblies)) { AddFrameworkReferences(lockFileLib, framework, frameworkAssemblies); } // Add framework assemblies with empty supported frameworks AddFrameworkReferences(lockFileLib, framework, package.FrameworkAssemblies.Where(f => !f.SupportedFrameworks.Any())); } var patterns = PatternDefinitions.DotNetPatterns; var criteriaBuilderWithTfm = new SelectionCriteriaBuilder(patterns.Properties.Definitions); var criteriaBuilderWithoutTfm = new SelectionCriteriaBuilder(patterns.Properties.Definitions); if (context.AllRuntimeNames != null) { foreach (var runtimeName in context.AllRuntimeNames) { criteriaBuilderWithTfm = criteriaBuilderWithTfm .Add["tfm", framework]["rid", runtimeName]; criteriaBuilderWithoutTfm = criteriaBuilderWithoutTfm .Add["rid", runtimeName]; } } criteriaBuilderWithTfm = criteriaBuilderWithTfm .Add["tfm", framework]; var criteria = criteriaBuilderWithTfm.Criteria; var compileGroup = contentItems.FindBestItemGroup(criteria, patterns.CompileTimeAssemblies, patterns.ManagedAssemblies); if (compileGroup != null) { lockFileLib.CompileTimeAssemblies = compileGroup.Items.Select(t => (LockFileItem)t.Path).ToList(); } var runtimeGroup = contentItems.FindBestItemGroup(criteria, patterns.ManagedAssemblies); if (runtimeGroup != null) { lockFileLib.RuntimeAssemblies = runtimeGroup.Items.Select(p => (LockFileItem)p.Path).ToList(); } var resourceGroup = contentItems.FindBestItemGroup(criteria, patterns.ResourceAssemblies); if (resourceGroup != null) { lockFileLib.ResourceAssemblies = resourceGroup.Items.Select(ToResourceLockFileItem).ToList(); } var nativeGroup = contentItems.FindBestItemGroup(criteriaBuilderWithoutTfm.Criteria, patterns.NativeLibraries); if (nativeGroup != null) { lockFileLib.NativeLibraries = nativeGroup.Items.Select(p => (LockFileItem)p.Path).ToList(); } // COMPAT: Support lib/contract so older packages can be consumed string contractPath = "lib/contract/" + package.Id + ".dll"; var hasContract = files.Any(path => path == contractPath); var hasLib = lockFileLib.RuntimeAssemblies.Any(); if (hasContract && hasLib && !VersionUtility.IsDesktop(framework)) { lockFileLib.CompileTimeAssemblies.Clear(); lockFileLib.CompileTimeAssemblies.Add(contractPath); } // See if there's a list of specific references defined for this target framework IEnumerable<PackageReferenceSet> referenceSets; if (VersionUtility.GetNearest(framework, package.PackageAssemblyReferences, out referenceSets)) { // Get the first compatible reference set var referenceSet = referenceSets.FirstOrDefault(); if (referenceSet != null) { // Remove all compile-time assemblies of which names do not appear in the References list lockFileLib.CompileTimeAssemblies.RemoveAll(path => path.Path.StartsWith("lib/") && !referenceSet.References.Contains(Path.GetFileName(path), StringComparer.OrdinalIgnoreCase)); } } return lockFileLib; }