public PackageInstaller(PackageReaderFactory packageReaderFactory, string rootDirectory, VersionResolutionTable versionTable, PackageManifest manifest, ICollection <IRepository> cacheRepositories, InstalledPackagesManager installedPackagesManager) { Guard.NotNull(packageReaderFactory, nameof(packageReaderFactory)); Guard.NotNull(rootDirectory, nameof(rootDirectory)); Guard.NotNull(versionTable, nameof(rootDirectory)); Guard.NotNull(manifest, nameof(rootDirectory)); Guard.NotNull(cacheRepositories, nameof(rootDirectory)); _packageReaderFactory = packageReaderFactory; _rootDirectory = rootDirectory; _versionTable = versionTable; _manifest = manifest; _cacheRepositories = cacheRepositories; _installedPackagesManager = installedPackagesManager; _libFolderPath = Path.Combine(rootDirectory, "lib"); _includeFolderPath = Path.Combine(rootDirectory, "include"); _toolsFolderPath = Path.Combine(rootDirectory, "tools"); _otherFolderPath = Path.Combine(rootDirectory, "other"); _index = _installedPackagesManager.ReadFromFolder(_rootDirectory); foreach (var package in versionTable.GetPackages()) { _manifest.Dependencies.Add(new PackageDependency(package.PackageId, new NuGet.Versioning.VersionRange(package.Version))); } }
private VersionResolutionTable Flatten() { var table = new VersionResolutionTable(); foreach (var node in _rootDependencyNode.Children) { FlattenNode(node, table); } return(table); }
/// <summary> /// Resolution algorithm in V1 is fairly simple. Every dependency has a /// version pattern and platform name. Steps: /// /// 1) Starting from root, resolve version patterns to version array for every node /// in the tree recursively (the whole structure is not known yet) /// /// 2) Starting from root, resolve latest version's manifest to get dependencies of /// dependencies. /// /// 3) Repeat steps 1-2 until all the version patterns and manifests are resolved. /// /// 4) Flatten the tree to array of (PackageId, Platform, Version[]) /// /// 5) Using (PackageId, Platform) as a key, merge array to a dictionary where /// value is Version[] and is an intersection of all Version[] for the key from /// array created in step 4. /// /// Data structure received in step 5 is the result of dependency resolution. /// Empty Version[] indicates a conflict for that package which can be displayed /// to a user using information from DependencyNode tree. /// /// </summary> /// <returns></returns> public void Resolve() { using (new TimeMeasurer(_writer.Text)) { //steps 1-2-3 ResolveAll(); } //steps 4-5 _table = Flatten(); _resolved = true; }
public void SimpleVersionIntersectionTest() { var pkg = new Package("Self.Library", new Version(2, 0, 0, 501)); pkg.Dependencies.Add(new PackageDependency("Company.Logging", "3.0")); pkg.Dependencies.Add(new PackageDependency("log4net", "1.2.8")); var dr = new DependencyResolution(pkg, new[] { _repo }); var result = dr.Resolve(); VersionResolutionTable table = result.Item1; IEnumerable <PackageKey> packages = table.GetPackages(); Assert.IsFalse(table.HasConflicts); Assert.AreEqual(2, packages.Count()); Assert.AreEqual(new Version(3, 0, 0, 4863), packages.ElementAt(0).Version); //Assert.AreEqual(new Version(2, 0, 0, 501), packages.ElementAt(0).Version); Assert.AreEqual(new Version(1, 2, 8, 0), packages.ElementAt(1).Version); }
private void FlattenNode(DependencyNode node, VersionResolutionTable collector) { if (node == null) { return; } if (!node.IsFull) { throw new InvalidOperationException("Cannot flatten unresolved node"); } collector.Intersect(node.UnresolvedPackage, node.ActiveSatisfayingData); foreach (var child in node.Children) { FlattenNode(child, collector); } }
public void SimpleConflictTest() { var pkg = new Package("Self.Library", new Version(2, 0, 0, 501)); pkg.Dependencies.Add(new PackageDependency("Company.Logging", "3.0")); pkg.Dependencies.Add(new PackageDependency("log4net", "1.1")); var dr = new DependencyResolution(pkg, new[] { _repo }); var result = dr.Resolve(); VersionResolutionTable table = result.Item1; Assert.IsTrue(table.HasConflicts); Assert.AreEqual(1, table.ConflictCount); var resolved = table.GetPackages(); var unresolved = table.GetConflictedPackages(); Assert.AreEqual(1, resolved.Count()); Assert.AreEqual(1, unresolved.Count()); string cd = dr.DescribeConflict(result.Item2, unresolved.First()); }
public IPackageInstaller GetInstaller(string rootDirectory, VersionResolutionTable versionTable, PackageManifest manifest) { return(new PackageInstaller(_packageReaderFactory, rootDirectory, versionTable, manifest, _repositoryFactory.TryGetEnabledRepos(RepositoryScope.Cache), _installedPackagesManager)); }