从Nuget取消包含所有历史版本的包

时间:2012-03-24 17:32:14

标签: visual-studio-2010 nuget

我正在寻找一个简单的解决方案,关于如何从Nuget库中取消(删除)包含所有版本的包。

我问这个,因为手动我一次可以为1个包做1个版本。我有很多包,每个包含~20 +版本..

请帮忙。Package History Listings

5 个答案:

答案 0 :(得分:4)

我知道这是旧的,但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"); }
        }
    }
}

运行需要一段时间,但它可以解决问题。

答案 1 :(得分:3)

您可以使用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 :(得分:2)

您可以编写一个批处理脚本来调用nuget delete,迭代所有包 - 请参阅http://docs.nuget.org/docs/reference/command-line-reference#Delete_Command

e.g。

nuget delete MyPackage 1.1 -NoPrompt

nuget delete MyPackage 1.2 -NoPrompt

等。在文本编辑器中使用grep或搜索/替换非常简单。

答案 3 :(得分:1)

如果您正在托管自己的nuget图库,则可以对nuget数据库执行以下SQL查询:

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相邻的批处理文件中并执行。

答案 4 :(得分:1)

您可以通过创建简单的控制台应用程序来使用工具组合。

创建一个新的控制台应用程序并安装包“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/