如何从服务器中删除 NuGet 包?

Posted

技术标签:

【中文标题】如何从服务器中删除 NuGet 包?【英文标题】:How to remove NuGet Package from server? 【发布时间】:2012-07-24 04:12:13 【问题描述】:

我已经向 nuget 添加了新包(我不是在谈论将包的引用添加到项目中)。我已将新包添加到服务器,以便其他人可以在他们的项目中使用/使用该包。

说包名是 Parser1.0.0.0.nupkg

问题是我忘记添加一个依赖项。现在我想编辑或删除并再次添加正确的。但我不想更改它的版本号。

有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

不支持永久删除包,但您可以控制它们的列出方式。 (假设您在谈论 nuget.org)。

登录后,在删除包页面上有附加信息。例如https://nuget.org/packages/Parser/1.0.0.0/Delete。

从删除包页面引用nuget的解释:

“为什么我不能删除我的包裹? 我们的政策是只永久删除真正需要它的 NuGet 包,例如包含密码、恶意/有害代码等的包。此政策与其他包管理器(如 Ruby Gems)采用的政策非常相似。

取消列出包将删除包在 NuGet 中的可用状态。由于三个主要原因,该软件包仍可作为依赖项下载。

其他软件包可能依赖于该软件包。这些包可能不一定在这个库中。 确保使用 NuGet 而不提交包(包还原)的人不会被破坏。 有助于确保重要的社区拥有的包不会被大量删除。”

我建议取消列出以前的包,并在添加依赖项后将版本升级到 1.0.0.1。

【讨论】:

是的,OP 可能不想增加版本号,但是当你带着你的包在公共场合兜风时,你必须遵守交通规则。 是的,当您错误地发布某些内容时,可以删除一个包。在您从 NuGet 获得的电子邮件中,您可以单击“联系支持人员”,这将链接到您的包管理,您可以在其中说明您想要删除它的原因,然后给出删除它的操作。并做了!您只需要同意您的操作可以通过删除来影响他人。 关于删除包的当前政策,请访问:docs.microsoft.com/en-us/nuget/nuget-org/policies/…。【参考方案2】:

假设您管理私有 NuGetGallery 服务器并有权访问 MSSQL Server 数据库,您可以通过删除库对其存在的了解来删除该包。

您可能永远不应该使用它,但是为了科学的利益,您可以忽略不使用的充分理由(请注意,这将删除名为“MyNastyPackage”的软件包的所有版本) :

DECLARE @PackageRegistrationKey int
SELECT @PackageRegistrationKey = [Key]
 FROM PackageRegistrations
 WHERE Id = 'MyNastyPackage'

BEGIN TRANSACTION
DELETE pf
 FROM [NuGetGallery].[dbo].[PackageFrameworks] pf
 JOIN Packages p ON pf.Package_Key = p.[Key]
 WHERE PackageRegistrationKey = @PackageRegistrationKey
DELETE pa
 FROM [NuGetGallery].[dbo].[PackageAuthors] pa
 JOIN Packages p ON pa.PackageKey = p.[Key]
 WHERE PackageRegistrationKey = @PackageRegistrationKey
DELETE gs
 FROM [NuGetGallery].[dbo].[GallerySettings] gs
 JOIN [PackageStatistics] ps ON gs.DownloadStatsLastAggregatedId = ps.[Key]
 JOIN Packages p ON ps.PackageKey = p.[Key]
 WHERE PackageRegistrationKey = @PackageRegistrationKey
DELETE ps
 FROM [NuGetGallery].[dbo].[PackageStatistics] ps
 JOIN Packages p ON ps.PackageKey = p.[Key]
 WHERE PackageRegistrationKey = @PackageRegistrationKey
DELETE pd
 FROM [NuGetGallery].[dbo].[PackageDependencies] pd
 JOIN Packages p ON pd.PackageKey = p.[Key]
 WHERE PackageRegistrationKey = @PackageRegistrationKey
DELETE
 FROM [NuGetGallery].[dbo].[Packages]
 WHERE PackageRegistrationKey = @PackageRegistrationKey
DELETE por
 FROM PackageOwnerRequests por
 JOIN PackageRegistrations pr ON pr.[Key] = por.PackageRegistrationKey
 WHERE pr.[Key] = @PackageRegistrationKey
DELETE pro
 FROM PackageRegistrationOwners pro
 JOIN PackageRegistrations pr ON pr.[Key] = pro.PackageRegistrationKey
 WHERE pr.[Key] = @PackageRegistrationKey
DELETE FROM PackageRegistrations
 WHERE [Key] = @PackageRegistrationKey
COMMIT TRANSACTION

【讨论】:

此脚本的变体(多个包,特定包版本):gist.github.com/grenade/4a8b6edcd10308a5882f)【参考方案3】:

好吧,在您的特定情况下,如果您有权访问 nuget 服务器,则可以通过手动编辑 .nuspec 文件来添加依赖项。打开 nuget 服务器的数据目录(它存储其 .nupkg 文件的位置),找到包并使用 NugetPackageExplorer 工具或手动编辑元数据(.nupkg 文件是一个 zip 存档,打开它并编辑 YourPackageName.nuspec 文件以添加依赖)。 它看起来类似于:

<dependencies>
  <dependency id="RouteMagic" version="1.1.0" />
  <dependency id="RouteDebugger" version="1.0.0" />
</dependencies>

【讨论】:

【参考方案4】:

如果您在包的子菜单(左侧)中单击删除包,您将被重定向到另一个页面,告诉您以下内容:

如果您需要永久删除软件包,请点击联系支持链接,我们会为您处理好

对我而言,这完全没问题,我联系了支持人员,要求删除我的包,因为我不小心将它上传到了生产性 NuGet 服务器而不是暂存环境。

但是,我始终建议先使用 staging.nuget.com 测试您的软件包。然后,您可以在 Visual Studio 中将暂存环境添加为包存储库以进行测试。

【讨论】:

【参考方案5】:

私有 NuGet 服务器是可能的。使用 NuGet 删除命令。

nuget delete MyPackage 1.0

更新:这仍然没有解决 OP 的问题,因为它不允许您重复使用版本号,因为它仍然被服务器锁定。没有永久删除特定版本包的安全方法。

【讨论】:

根据this documentation page,命令“删除或取消列出包”,取决于服务器的配置方式,因此实际上可能可以重用版本号。像这样的命令对我有用:nuget delete MyPackage 1.0 -Source http://package.contoso.com/source -apikey A1B2C3. 而不是nuget delete,在私人服务器上,您只需转到提供包的文件夹并将该版本文件夹移至其他位置。 @StingyJack - 我们使用 TFS 作为我们的包存储库,所以我相信它们都存储在数据库中......我无权访问。我可以看到您的建议适用于基于文件系统的存储库(我过去曾使用过这些)。 @MichaelEarls - TFS On-Premise with a package repo?什么版本? (我还在 2015.4 - 没有时间升级) @StingyJack 在此评论中,我们使用的是 2018 版更新 3.1 On-Premise TFS【参考方案6】:

然后,当您成功发布它时,您会收到来自 NuGet 的电子邮件。

请留意这封电子邮件,因为他们写道:

If this was not intended, please "contact support".

如果你点击“联系支持”,这将链接到你在 NuGet 中的包管理,你可以在其中给出你想要删除它的原因,然后给出删除它的操作。

就是这样!

【讨论】:

以上是关于如何从服务器中删除 NuGet 包?的主要内容,如果未能解决你的问题,请参考以下文章

vs中删除nuget包

手动删除引用nuget如何还原

如何使用MSDeploy更新服务器中的Nuget包

如何搭建Nuget服务器

从基于日期的版本控制切换到语义版本控制后,如何防止 NuGet 升级包?

如何从从 NuGet 包获得的 RCL 导入 Razor 页面?