Nuget 本地提要搜索缓慢

Nuget local feed slow search

我设置了本地 Nuget 文件夹 \servername\packages 并配置 Visual Studio 将其用作源而不是 https://api.nuget.org/v3/index.json。它工作正常。但是,使用 "Manage NuGet packages for Solution" 搜索包(示例:Automapper)非常非常慢。它最终会带回结果。

有什么办法可以加快搜索速度吗? (例如添加某种索引)。

本地 Nuget 文件夹示例:

\servername\packages\automapper
\servername\packages\microsoft.aspnetcore

当您将包推送到 nuget.org 或任何其他 NuGet 服务器时,您可能会注意到该包不是立即可用的。这是因为服务器有某种摄取过程。它可能包括病毒扫描或其他检查,但它也包括搜索索引。因此,当您上传包时,服务器会预处理搜索数据,以便在收到搜索查询时,可以非常快速地在搜索索引中查找结果。

本地供稿说明

当您将文件放入 "local" 提要时,没有搜索索引。进行搜索时,NuGet 必须查看提要中每个包的每个版本。尽管 "v3" 文件夹布局在磁盘上提取了 nuspec 文件,但我不确定它是否实际使用过。但对于仅包含 nupkg 文件的本地文件夹,NuGet 必须: 打开 nupkg (zip) 文件,并开始向后扫描文件以找到 zip 文件 "central directory"。找到中央目录后,向前扫描它以找到 nuspec 文件的元数据(希望操作系统将此数据保存在其文件缓存中)。找到 nuspec 文件的 zip 元数据(数据位置、大小、压缩算法)后,查找文件的数据位置,并读取压缩字节。解压缩 nuspec 数据。将 nuspec 文件解析为 XML 文件。最后在解析的 nuspec 中查找您的搜索关键字。提醒,这是针对提要中每个包的每个版本完成的。

尽管 NuGet 可以(而且我敢肯定)可以并行执行此操作,但是您的 CPU 内核有限,并且您的 IO 速度可能是一个因素,所以如果您有很多包,它总是需要时间。如 IO 所述,当 "local" 文件位于网络共享上时,每个 IO 操作都会增加网络 IO 的延迟。如果您不相信 IO 延迟是一个大问题,我建议编写一个小程序,其中包含一个 class 实现 Stream ,它只会在每次读取、查找、定位时写入控制台等被调用,然后在实际流上调用相同的方法。将此 LoggingStream 与 ZipArchive 结合使用以打开 zip,在 zip 中找到一个特定文件,然后读取 zip。查看 Stream class 上有多少方法被调用,特别是 Seek,因为这大大降低了操作系统预取数据的能力。

solution/workaround

无论如何,有一个解决方案或解决方法,具体取决于您(不)喜欢它的程度。使用本地服务器。 https://docs.microsoft.com/nuget/hosting-packages/overview.

上列出了几个

我知道在某些公司环境中,获得 Web 服务器比获得网络共享要困难得多,但事实就是如此。如果没有搜索索引,搜索就不可能很快,在我看来,本地提要的最大好处是只需放入文件即可简单。如果您必须 运行 一些工具来为本地提要生成搜索索引,那么它并不比推送到私有服务器更简单。