从Nuget中删除所有历史版本的软件包
我正在寻找一个简单的解决方案,了解如何从Nuget库中删除(删除)所有软件包中的软件包。从Nuget中删除所有历史版本的软件包
我在问这个问题,因为手动我可以在1个软件包中一次完成1个版本。而且我有很多包装,每个版本〜20+。
请帮忙。
你可以写一个批处理脚本调用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或搜索非常简单/替换在文本编辑器。
如果你是托管自己的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在项目进入控制台应用程序项目(添加它在解决方案资源管理,并确保它被复制到输出目录)
接下来创建一个使用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做到这一点,这里是一个函数:
感谢名单。我有点寻找一个“更多”自动化解决方案:) – Marty 2012-06-01 13:48:04