public Package.DependencySet GetDependencySet() { var dependencies = GetDependencies().Where(m => !m.DevelopmentDependency).ToList(); var set = new Package.DependencySet(); var targets = dependencies.Select(r => r.TargetFramework).Distinct().ToList(); if (targets.Any(t => !string.IsNullOrWhiteSpace(t))) { var groups = new List <Package.DependencyGroup>(); foreach (var target in targets) { var group = new Package.DependencyGroup { TargetFramework = string.IsNullOrWhiteSpace(target) ? null : target }; Expression <Func <DependencyViewModel, bool> > exp = null; if (string.IsNullOrWhiteSpace(target)) { exp = r => string.IsNullOrWhiteSpace(r.TargetFramework); } else { exp = r => r.TargetFramework == target; } group.Dependencies = dependencies .Where(exp.Compile()) .Select(r => new Package.Dependency { Id = r.Id, Version = r.Version }).OrderBy(m => m.Id).ToList(); if (group.Dependencies.Count > 0) { groups.Add(group); } } set.Groups = groups.OrderBy(m => m.TargetFramework).ToList(); } else { set.Dependencies = dependencies .Select(r => new Package.Dependency { Id = r.Id, Version = r.Version }).OrderBy(m => m.Id).ToList(); } return(set); }
public static void MergeDependency(this Package.MetaData metadata, IEnumerable <DependencyViewModel> dependencyViewModels) { var dependencies = dependencyViewModels.ToList(); if (!dependencies.Any()) { return; } //reset metadata.Dependencies = new Package.DependencySet(); var dep = metadata.Dependencies; //remove exists dep?.Groups?.ForEach(g => { g.Dependencies.RemoveAll(m => dependencies.Any(k => k.Id == m.Id)); }); dep?.Dependencies?.RemoveAll(m => dependencies.Any(k => k.Id == m.Id)); //new target framework var frameworks = dependencies.Where( d => (dep.Groups == null || dep.Groups.All(g => g.TargetFramework != d.TargetFramework))) .Select(m => m.TargetFramework) .Where(m => !string.IsNullOrWhiteSpace(m)) .Distinct().ToList(); if (frameworks.Count > 0) { if (dep.Groups == null) { dep.Groups = new List <Package.DependencyGroup>(); } frameworks.ForEach(f => dep.Groups.Add(new Package.DependencyGroup { TargetFramework = f })); } //append if (dep.Groups != null && dep.Groups.Count > 0) { //merge from packages.config dep.Groups.ForEach(g => { g.Dependencies.AddRange( dependencies.Where(d => d.TargetFramework == g.TargetFramework && !d.DevelopmentDependency) .Select(m => new Package.Dependency { Id = m.Id, Version = m.Version })); }); //merge my dependencies without group if (dep.Dependencies != null && dep.Dependencies.Count > 0) { var g = dep.Groups.FirstOrDefault(m => m.TargetFramework == null); if (g == null) { g = new Package.DependencyGroup(); dep.Groups.Add(g); } g.Dependencies = dep.Dependencies.ToList(); dep.Dependencies.Clear(); } } else { if (dep.Dependencies == null) { dep.Dependencies = new List <Package.Dependency>(); } dep.Dependencies.AddRange( dependencies.Where(p => string.IsNullOrWhiteSpace(p.TargetFramework) && !p.DevelopmentDependency) .Select(m => new Package.Dependency { Id = m.Id, Version = m.Version })); } //clear empty groups dep?.Groups?.RemoveAll(g => !g.Dependencies.Any()); }