public void AddNugetPackage(string projectFile, string packageId, string minVersionInclusive) { AddOrUpdateRequiredPackage( msbuildProject: GetMsbuildProject(projectFile), packageId: packageId, referer: Referer.Create("Software Factory", Utility.GetMinVersionSpecInclusive(minVersionInclusive))); }
private void ConsolidateVersions(MsbuildProject project) { bool hadWork; do { hadWork = false; foreach (var node in project.PackageNodes.ToArray()) { var packageOfHighestVersion = GetPackageOfHighestVersion(node.RequiredPackage.Id); if (!node.Referers.All(x => x.VersionSpec.IsSatisfiedBy(packageOfHighestVersion.Version))) { throw new Exception("Using solution highest package version would not satisfy all version requirements."); } if (node.RequiredPackage.Version != packageOfHighestVersion.Version) { AddOrUpdateRequiredPackage(project, node.RequiredPackage.Id, Referer.CreateFromSolutionHighestVersion(packageOfHighestVersion)); hadWork = true; } } } while (hadWork); }
private MsbuildProject LoadMsbuildProject(string project) { if (string.IsNullOrWhiteSpace(project)) { throw new ArgumentNullException(nameof(project)); } #warning this should possbily be a warning and continue, this scenario can happen when you remove a project and have not manually updated the sln file if (!File.Exists(project)) { throw new FileNotFoundException(project); } var msBuildProject = new MsbuildProject(project); foreach (var package in _nugetServices.GetInstalled(project)) { msBuildProject.PackageNodes.Add(PackageNode.Create( package: package, installedPackage: package, referer: Referer.Create( name: project, versionSpec: package.Version.ToMinVersionSpecInclusive()))); } return(msBuildProject); }
private void ValidateDependencies(MsbuildProject msbuildProject) { foreach (var packageNode in msbuildProject.PackageNodes.ToArray()) { foreach (var dependency in packageNode.RequiredPackage.GetDependencies(_nugetServices.GetTargetFrameworkName(msbuildProject.Path))) { AddOrUpdateRequiredPackage(msbuildProject, dependency.Id, Referer.Create(packageNode, dependency.VersionSpec)); } } }
public void AddReferer(Referer referer) { var existingReferer = Referers.SingleOrDefault(x => x.PackageNode == referer.PackageNode && x.Name == referer.Name); if (existingReferer != null) { Referers.Remove(existingReferer); } Referers.Add(referer); }
private PackageNode(IPackage requiredPackage, IPackage installedPackage, Referer referer) { Dependencies = new HashSet <PackageNode>(); Referers = new HashSet <Referer>(); RequiredPackage = requiredPackage; InstalledPackage = installedPackage; if (referer != null) { Referers.Add(referer); } }
private void AddOrUpdateRequiredPackage(MsbuildProject msbuildProject, string packageId, Referer referer) { var packageOfHighestVersion = GetPackageOfHighestVersion(packageId); var package = packageOfHighestVersion != null && referer.VersionSpec.IsSatisfiedBy(packageOfHighestVersion.Version) ? packageOfHighestVersion : _nugetServices.GetPackage( packageId: packageId, versionSpec: referer.VersionSpec, allowPrereleaseVersions: _allowPreReleaseVersions); var packageNode = msbuildProject.PackageNodes .SingleOrDefault(x => x.RequiredPackage.Id.Equals(packageId, StringComparison.InvariantCultureIgnoreCase)); if (packageNode == null) { packageNode = PackageNode.Create(package); msbuildProject.PackageNodes.Add(packageNode); } packageNode.AddReferer(referer); if (packageOfHighestVersion != null) { packageNode.AddReferer(Referer.CreateFromSolutionHighestVersion(packageOfHighestVersion)); } if (referer.VersionSpec.RequiresLowerThan(packageNode.RequiredPackage.Version)) { throw new Exception("Installing package would require a downgrade."); } if (packageNode.RequiredPackage.Version < package.Version) { packageNode.UpdateRequiredPackage(package); } if (!packageNode.Referers.All(x => x.VersionSpec.IsSatisfiedBy(packageNode.RequiredPackage.Version))) { throw new Exception("Could not resolve dependencies."); } foreach (var dependency in packageNode.RequiredPackage.GetDependencies(_nugetServices.GetTargetFrameworkName(msbuildProject.Path))) { AddOrUpdateRequiredPackage(msbuildProject, dependency.Id, Referer.Create(packageNode, dependency.VersionSpec)); } }
public static PackageNode Create(IPackage package, Referer referer = null, IPackage installedPackage = null) => new PackageNode(package, installedPackage, referer);
protected bool Equals(Referer other) { return(Equals(PackageNode, other.PackageNode) && Equals(VersionSpec, other.VersionSpec) && string.Equals(Name, other.Name, StringComparison.InvariantCultureIgnoreCase)); }