private List <PackageRequirement> GetPackageRequirements(List <PackageRequirement> requirements, string name, string version, string source, bool preRelease, string framework, bool nodeps = false)
        {
            if (requirements.All(r => r.Name != name))
            {
                requirements.Add(new PackageRequirement
                {
                    Name       = name,
                    PreRelease = preRelease,
                    Source     = source ?? _settings.DefaultRepository,
                    Version    = version
                });
            }


            var pkg = default(Package);

            if (version == null)
            {
                pkg = _packageSearcher.Search($"PackageId:{name}", preRelease)
                      .OrderByDescending(p => p.Version).FirstOrDefault();
            }
            else if (version.Contains("*"))
            {
                pkg = _packageSearcher.Search($"PackageId:{name}", preRelease)
                      .OrderByDescending(p => p.Version).FirstOrDefault(s => Regex.IsMatch(s.Version, version));
            }
            else if (version.Contains(","))
            {
                var versionParts = version.Split(',');
                var leftVer      = versionParts[0].Replace("(", "").Replace("[", "").Trim();
                var rightVer     = versionParts[1].Replace(")", "").Replace("]", "").Trim();
                var includeLeft  = !versionParts[0].Contains("(");
                var includeRight = !versionParts[1].Contains(")");
                var limitRight   = versionParts[1].Contains(")") || versionParts[1].Contains("]");
                var leftsemVer   = string.IsNullOrEmpty(leftVer) ? new SemVersion(0) : SemVersion.Parse(leftVer);
                var rightsemVer  = string.IsNullOrEmpty(rightVer) ? new SemVersion(0) : SemVersion.Parse(rightVer);

                pkg = _packageSearcher.Search($"PackageId:{name}", preRelease).OrderByDescending(p => p.Version)
                      .FirstOrDefault(
                    p =>
                {
                    var currentVer = SemVersion.Parse(p.Version);
                    var rightPass  = false;
                    var leftPass   = false;

                    if (rightsemVer == new SemVersion(0))
                    {
                        rightPass = true;
                    }

                    if (limitRight && includeRight && currentVer <= rightsemVer)
                    {
                        rightPass = true;
                    }

                    if (limitRight && !includeRight && currentVer < rightsemVer)
                    {
                        rightPass = true;
                    }

                    if (!limitRight && currentVer >= rightsemVer)
                    {
                        rightPass = true;
                    }

                    if (includeLeft && currentVer >= leftsemVer)
                    {
                        leftPass = true;
                    }

                    if (!includeLeft && currentVer > leftsemVer)
                    {
                        leftPass = true;
                    }

                    if (leftsemVer == new SemVersion(0))
                    {
                        leftPass = true;
                    }

                    return(leftPass && rightPass);
                });
            }
            else
            {
                pkg = _packageSearcher.Search($"PackageId:{name}", preRelease)
                      .FirstOrDefault(s => String.Equals(s.Version, version, StringComparison.CurrentCultureIgnoreCase));
            }

            try
            {
                requirements.FirstOrDefault(r => r.Name == pkg.Id).Version = pkg.Version;
            }
            catch (Exception e)
            {
                throw new NuGetException($"Can't resolve package {name} {version}", e);
            }

            var spec = default(NuSpec);

            try
            {
                spec = _packageDownloader.DownloadNuSpec(pkg.Id, pkg.Version);
            }
            catch
            {
                _packageDownloader.DownloadArchive(pkg, $"{Environment.GetEnvironmentVariable("temp")}\\{pkg.Id}-{pkg.Version}.nupkg");
                spec = _packageDownloader.DownloadNuSpecFromFile(
                    $"{Environment.GetEnvironmentVariable("temp")}\\{pkg.Id}-{pkg.Version}.nupkg");
            }

            if (nodeps)
            {
                return(requirements);
            }

            foreach (var dep in spec.Dependancies)
            {
                if (_settings.BlockedPackages.Any(p => string.Equals(p, dep.Id, StringComparison.CurrentCultureIgnoreCase)))
                {
                    continue;
                }

                if (requirements.All(r => r.Name != dep.Id))
                {
                    requirements.Add(new PackageRequirement
                    {
                        Name       = dep.Id,
                        PreRelease = preRelease,
                        Source     = source,
                        Version    = dep.Version
                    });

                    requirements = GetPackageRequirements(requirements, dep.Id, dep.Version, source,
                                                          preRelease, framework);
                }
            }

            foreach (var group in spec.Groups)
            {
                var groupMatch = framework == null && _settings.SupportedPlatforms.Contains(group.Name) || framework != null && group.Name.Contains(framework) || string.IsNullOrEmpty(group.Name);

                if (!groupMatch)
                {
                    continue;
                }

                foreach (var dep in group.Dependancies)
                {
                    if (_settings.BlockedPackages.Any(p => string.Equals(p, dep.Id, StringComparison.CurrentCultureIgnoreCase)))
                    {
                        continue;
                    }

                    if (requirements.All(r => r.Name != dep.Id))
                    {
                        requirements.Add(new PackageRequirement
                        {
                            Name       = dep.Id,
                            PreRelease = preRelease,
                            Source     = source,
                            Version    = dep.Version
                        });

                        requirements = GetPackageRequirements(requirements, dep.Id, dep.Version, source,
                                                              preRelease, framework);
                    }
                }
            }

            return(requirements);
        }