Удалить пакет из Nuget со всеми его историческими версиями - PullRequest
2 голосов
/ 24 марта 2012

Я ищу простое решение, как отменить (удалить) пакет из библиотеки Nuget со всеми его версиями.

Я спрашиваю об этом, потому что вручную я могу сделать это по 1 версии за один пакет. И у меня есть много пакетов с ~ 20 + версиями в каждом ..

Пожалуйста, помогите. Package History Listings

Ответы [ 5 ]

4 голосов
/ 29 июня 2014

Я знаю, что это старый, но команда nuget "delete" все еще не реализована, поэтому мне нужно решение.Возможно, кто-то еще может извлечь из этого пользу.Я создал программу командной строки и добавил пакет Nuget Headless.Затем код выглядит следующим образом:

 class Program
{
    static void Main(string[] args)
    {
        List<PostEntry> parameters = new List<PostEntry>();
        using (var browser = new Browser())
        {
            var loginPage = browser.GoTo<LoginPage>();
            parameters.Clear();
            parameters.Add(new PostEntry("SignIn.UserNameOrEmail", "yournugetusername"));
            parameters.Add(new PostEntry("SignIn.Password", "yournugetpassword"));
            parameters.Add(new PostEntry("ReturnUrl", "/"));
            parameters.Add(new PostEntry("LinkingAccount", "false"));
            parameters.Add(new PostEntry("__RequestVerificationToken", loginPage.Find<HtmlElement>().ById("signIn").Find<HtmlInput>().ByName("__RequestVerificationToken").Value));

            browser.PostTo(parameters, new Uri("https://www.nuget.org/users/account/SignIn"));
            Console.WriteLine("logged in");


            var cont = true;
            while (cont)
            {
                var packagesPage = browser.GoTo<PackagesPage>();
                Console.WriteLine("at packages page");

                var links = packagesPage.Find<HtmlElement>()
                    .ById("published")
                    .Find<HtmlLink>()
                    .AllByPredicate(o => o.GetAttribute("title") == "Delete"
                        && (o.Href.Contains("/IdOfPackageIWantToDelete/")
                            || o.Href.Contains("/IdOfAnotherPackageIWantToDelete/")));

                cont = links.Count() >= 1;
                if (links.Any())
                {
                    var htmlLink = links.First();
                    var linkPage = htmlLink.Href;
                    Console.WriteLine(linkPage);
                    var deletePackagePage = htmlLink.Click();

                    parameters.Clear();
                    parameters.Add(new PostEntry("Listed", "false"));
                    parameters.Add(new PostEntry("__RequestVerificationToken", deletePackagePage.Find<HtmlElement>().ById("body").Find<HtmlInput>().ByName("__RequestVerificationToken").Value));

                    browser.PostTo(parameters, new Uri("https://www.nuget.org" + linkPage));
                    Console.WriteLine("delete submitted");
                }
            }

        }
        Console.WriteLine("Hit any key to quit");
        Console.ReadKey();
    }
    public class LoginPage : HtmlPage
    {

        public override Uri TargetLocation
        {
            get { return new Uri("https://www.nuget.org/users/account/LogOn?returnUrl=%2F"); }
        }
    }
    public class PackagesPage : HtmlPage
    {
        public override Uri TargetLocation
        {
            get { return new Uri("https://www.nuget.org/account/Packages"); }
        }
    }
}

Потребуется некоторое время, чтобы запустить, но это помогает.

3 голосов
/ 28 марта 2017

Вы можете сделать это с PowerShell, вот функция:

function Remove-AllNuGetPackageVersions($PackageId, $ApiKey)
{
    $lower = $PackageId.ToLowerInvariant();

    $json = Invoke-WebRequest -Uri "https://api.nuget.org/v3-flatcontainer/$lower/index.json" | ConvertFrom-Json

    foreach($version in $json.versions)
    {
      Write-Host "Unlisting $PackageId, Ver $version"
      Invoke-Expression "nuget delete $PackageId $version $ApiKey -source https://api.nuget.org/v3/index.json -NonInteractive"
    }
}
2 голосов
/ 16 мая 2012

Вы можете написать пакетный скрипт для вызова nuget delete, повторяя все ваши пакеты - см. http://docs.nuget.org/docs/reference/command-line-reference#Delete_Command

например,

nuget delete MyPackage 1.1 -NoPrompt

nuget delete MyPackage 1.2 -NoPrompt

и т. Д.Довольно просто с помощью grep или поиска / замены в текстовом редакторе.

1 голос
/ 05 сентября 2016

Вы можете использовать комбинацию инструментов, создав простое консольное приложение.

Создайте новое консольное приложение и установите пакет «Nuget.Core».

Добавьте следующий метод, чтобы получить список всех версий пакета:

private static IEnumerable<IPackage> GetListedPackages(string packageID)
{
    var repo = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2");
    var packages = from package in repo.FindPackagesById(packageID)
        where package.IsListed()
        select package;
    return packages;
}

Затем скопируйте nuget.exe из папки ".nuget" в одном из ваших проектов в проект консольного приложения (добавьте его в обозреватель решений и убедитесь, что он скопирован в выходной каталог)

enter image description here

Далее создайте новый метод, который использует nuget.exe для отмены выбора версии пакета:

private static string UnlistPackage(IPackage package, string apiKey)
{
    var arguments = $"delete {package.Id} {package.Version} -ApiKey {apiKey} -NonInteractive";
    var psi = new ProcessStartInfo("nuget.exe", arguments)
    {
        RedirectStandardOutput = true,
        WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory,
        UseShellExecute = false
    };
    var process = Process.Start(psi);
    process.WaitForExit();
    return process.StandardOutput.ReadToEnd();
}

Наконец, измените метод Main, чтобы он получал список и удалял все версии:

private static void Main(string[] args)
{
    var packageID = "yourPackageName";
    var apiKey = "yourKeyFromNugetOrg";
    var packages = GetListedPackages(packageID);
    foreach (var package in packages)
    {
        Console.WriteLine("Unlisting package " + package);
        var output = UnlistPackage(package, apiKey);
        Console.WriteLine(output);
    }
    Console.Write("Completed. Press ENTER to quit.");
    Console.ReadLine();
}

источник: http://blog.gauffin.org/2016/09/how-to-remove-a-package-from-nuget-org/

1 голос
/ 24 октября 2013

Если вы размещаете свою собственную галерею nuget, вы можете выполнить следующий SQL-запрос к базе данных nuget:

select 'nuget delete ' + pr.Id + ' ' + p.Version + ' {ApiKey} -source {Source} -noninteractive' from Packages p
join PackageRegistrations pr
   on p.PackageRegistrationKey = pr.[Key]
where pr.Id = '{PackageId}' AND
   p.Listed = 1

Замените {ApiKey}, {Source} и {PackageId} на ваши собственные значенияЗатем я поместил результаты в пакетный файл рядом с nuget.exe и выполнил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...