从Nuget中删除所有历史版本的软件包

问题描述:

我正在寻找一个简单的解决方案,了解如何从Nuget库中删除(删除)所有软件包中的软件包。从Nuget中删除所有历史版本的软件包

我在问这个问题,因为手动我可以在1个软件包中一次完成1个版本。而且我有很多包装,每个版本〜20+。

请帮忙。 Package History Listings

你可以写一个批处理脚本调用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或搜索非常简单/替换在文本编辑器。

+0

感谢名单。我有点寻找一个“更多”自动化解决方案:) – Marty 2012-06-01 13:48:04

如果你是托管自己的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},{来源}和{包标识}与自己的价值观,我然后将结果放入与nuget.exe相邻的批处理文件中并执行。

我知道这是旧的,但nuget“删除”命令仍未实现,所以我需要一个解决方案。也许有人仍然可以从中受益。我创建了一个命令行程序并添加了无头头的Nuget包。然后,代码是:

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"); } 
     } 
    } 
} 

它需要一段时间才能运行,但它的确有用。

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

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

最后改变主要方法,因此得到一个列表,并删除所有版本:

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/

您可以使用PowerShell做到这一点,这里是一个函数: