public static PackagesLockFile FromPackagesConfigFile( string pcFile, NuGetFramework projectTfm, string packagesFolderPath, CancellationToken token) { if (pcFile == null) { throw new ArgumentNullException(nameof(pcFile)); } if (!File.Exists(pcFile)) { throw new FileNotFoundException(string.Format(Strings.Error_FileDoesNotExist, pcFile), pcFile); } if (projectTfm == null) { throw new ArgumentNullException(nameof(projectTfm)); } if (packagesFolderPath == null) { throw new ArgumentNullException(nameof(packagesFolderPath)); } if (!Directory.Exists(packagesFolderPath)) { throw new DirectoryNotFoundException(string.Format(Strings.Error_DirectoryDoesNotExist, packagesFolderPath)); } var lockFile = new PackagesLockFile(); var target = new PackagesLockFileTarget(); lockFile.Targets.Add(target); target.TargetFramework = projectTfm; using (var stream = File.OpenRead(pcFile)) { var contentHashUtil = new PackagesConfigContentHashProvider(new FolderNuGetProject(packagesFolderPath)); var reader = new PackagesConfigReader(stream); foreach (var package in reader.GetPackages(allowDuplicatePackageIds: true)) { var dependency = new LockFileDependency { Id = package.PackageIdentity.Id, ContentHash = contentHashUtil.GetContentHash(package.PackageIdentity, token), RequestedVersion = new VersionRange(package.PackageIdentity.Version, includeMinVersion: true, package.PackageIdentity.Version, includeMaxVersion: true), ResolvedVersion = package.PackageIdentity.Version, Type = PackageDependencyType.Direct }; target.Dependencies.Add(dependency); } } return(lockFile); }
public PackagesLockFile CreateNuGetLockFile(LockFile assetsFile) { var lockFile = new PackagesLockFile(); var libraryLookup = assetsFile.Libraries.Where(e => e.Type == LibraryType.Package) .ToDictionary(e => new PackageIdentity(e.Name, e.Version)); foreach (var target in assetsFile.Targets) { var nuGettarget = new PackagesLockFileTarget() { TargetFramework = target.TargetFramework, RuntimeIdentifier = target.RuntimeIdentifier }; var framework = assetsFile.PackageSpec.TargetFrameworks.FirstOrDefault( f => EqualityUtility.EqualsWithNullCheck(f.FrameworkName, target.TargetFramework)); var libraries = target.Libraries; // check if this is RID-based graph then only add those libraries which differ from original TFM. if (!string.IsNullOrEmpty(target.RuntimeIdentifier)) { var onlyTFM = assetsFile.Targets.First(t => EqualityUtility.EqualsWithNullCheck(t.TargetFramework, target.TargetFramework)); libraries = target.Libraries.Where(lib => !onlyTFM.Libraries.Any(tfmLib => tfmLib.Equals(lib))).ToList(); } foreach (var library in libraries.Where(e => e.Type == LibraryType.Package)) { var identity = new PackageIdentity(library.Name, library.Version); var dependency = new LockFileDependency() { Id = library.Name, ResolvedVersion = library.Version, Sha512 = libraryLookup[identity].Sha512, Dependencies = library.Dependencies }; var framework_dep = framework?.Dependencies.FirstOrDefault( dep => StringComparer.OrdinalIgnoreCase.Equals(dep.Name, library.Name)); if (framework_dep != null) { dependency.Type = PackageDependencyType.Direct; dependency.RequestedVersion = framework_dep.LibraryRange.VersionRange; } else { dependency.Type = PackageDependencyType.Transitive; } nuGettarget.Dependencies.Add(dependency); } foreach (var projectReference in libraries.Where(e => e.Type == LibraryType.Project || e.Type == LibraryType.ExternalProject)) { var dependency = new LockFileDependency() { Id = projectReference.Name, Dependencies = projectReference.Dependencies, Type = PackageDependencyType.Project }; nuGettarget.Dependencies.Add(dependency); } nuGettarget.Dependencies = nuGettarget.Dependencies.OrderBy(d => d.Type).ToList(); lockFile.Targets.Add(nuGettarget); } return(lockFile); }
public PackagesLockFile CreateNuGetLockFile(LockFile assetsFile) { var lockFile = new PackagesLockFile(GetPackagesLockFileVersion(assetsFile)); var libraryLookup = assetsFile.Libraries.Where(e => e.Type == LibraryType.Package) .ToDictionary(e => new PackageIdentity(e.Name, e.Version)); foreach (var target in assetsFile.Targets) { var nuGettarget = new PackagesLockFileTarget() { TargetFramework = target.TargetFramework, RuntimeIdentifier = target.RuntimeIdentifier }; var framework = assetsFile.PackageSpec.TargetFrameworks.FirstOrDefault( f => EqualityUtility.EqualsWithNullCheck(f.FrameworkName, target.TargetFramework)); IEnumerable <LockFileTargetLibrary> libraries = target.Libraries; // check if this is RID-based graph then only add those libraries which differ from original TFM. if (!string.IsNullOrEmpty(target.RuntimeIdentifier)) { var onlyTFM = assetsFile.Targets.First(t => EqualityUtility.EqualsWithNullCheck(t.TargetFramework, target.TargetFramework)); libraries = target.Libraries.Where(lib => !onlyTFM.Libraries.Any(tfmLib => tfmLib.Equals(lib))); } foreach (var library in libraries.Where(e => e.Type == LibraryType.Package)) { var identity = new PackageIdentity(library.Name, library.Version); var dependency = new LockFileDependency() { Id = library.Name, ResolvedVersion = library.Version, ContentHash = libraryLookup[identity].Sha512, Dependencies = library.Dependencies }; var framework_dep = framework?.Dependencies.FirstOrDefault( dep => StringComparer.OrdinalIgnoreCase.Equals(dep.Name, library.Name)); CentralPackageVersion centralPackageVersion = null; framework?.CentralPackageVersions.TryGetValue(library.Name, out centralPackageVersion); if (framework_dep != null) { dependency.Type = PackageDependencyType.Direct; dependency.RequestedVersion = framework_dep.LibraryRange.VersionRange; } // The dgspec has a list of the direct dependencies and changes in the direct dependencies will invalidate the lock file // A dgspec does not have information about transitive dependencies // At the restore time the transitive dependencies could be pinned from central package version management file // By marking them will allow to evaluate when to invalidate the packages.lock.json // in cases that a central transitive version is updated, removed or added the lock file will be invalidated else if (centralPackageVersion != null) { // This is a transitive dependency that is in the list of central dependencies. dependency.Type = PackageDependencyType.CentralTransitive; dependency.RequestedVersion = centralPackageVersion.VersionRange; } else { dependency.Type = PackageDependencyType.Transitive; } nuGettarget.Dependencies.Add(dependency); } var projectFullPaths = assetsFile.Libraries .Where(l => l.Type == LibraryType.Project || l.Type == LibraryType.ExternalProject) .ToDictionary(l => new PackageIdentity(l.Name, l.Version), l => l.MSBuildProject); foreach (var projectReference in libraries.Where(e => e.Type == LibraryType.Project || e.Type == LibraryType.ExternalProject)) { var projectIdentity = new PackageIdentity(projectReference.Name, projectReference.Version); var projectFullPath = projectFullPaths[projectIdentity]; var id = PathUtility.GetStringComparerBasedOnOS().Equals(Path.GetFileNameWithoutExtension(projectFullPath), projectReference.Name) ? projectReference.Name.ToLowerInvariant() : projectReference.Name; var dependency = new LockFileDependency() { Id = id, Dependencies = projectReference.Dependencies, Type = PackageDependencyType.Project }; nuGettarget.Dependencies.Add(dependency); } nuGettarget.Dependencies = nuGettarget.Dependencies.OrderBy(d => d.Type).ToList(); lockFile.Targets.Add(nuGettarget); } return(lockFile); }