Visual studio 2017 Nuget本地源慢速搜索

Visual studio 2017 Nuget本地源慢速搜索,visual-studio-2017,nuget,nuget-server,Visual Studio 2017,Nuget,Nuget Server,我已经设置了一个本地Nuget文件夹\\servername\packages,并将Visual Studio配置为将其用作源文件而不是源文件。它很好用。但是,使用“Manage NuGet packages for Solution”搜索包(例如:Automapper)的速度非常慢。但它最终带来了结果 有什么方法可以加快搜索速度吗?(例如,添加某种索引) 本地Nuget文件夹的示例: \\servername\packages\automapper \\servername\packages\

我已经设置了一个本地Nuget文件夹
\\servername\packages
,并将Visual Studio配置为将其用作源文件而不是源文件。它很好用。但是,使用“Manage NuGet packages for Solution”搜索包(例如:Automapper)的速度非常慢。但它最终带来了结果

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

本地Nuget文件夹的示例:

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

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

本地源解释

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

尽管NuGet可以(我肯定是这样)并行地完成这项工作,但您的CPU内核有限,而且您的IO速度可能是一个因素,因此如果您有许多软件包,这总是需要时间的。如前所述,当“本地”文件位于网络共享上时,每个IO操作都会增加网络IO的延迟。如果您不认为IO延迟是一个大问题,我建议编写一个小程序,让一个类实现
Stream
,它只在每次调用read、seek、position等时写入控制台,然后在实际流上调用相同的方法。将此LoggingStream与ZipArchive一起使用可打开zip,在zip中查找一个特定文件,然后读取zip。查看流类上调用了多少方法,特别是Seek,因为这大大降低了操作系统预取数据的能力

解决方案/解决方案

无论如何,有一个解决方案或变通办法,这取决于你(dis)有多喜欢它。使用本地服务器。上面列出了几个


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

谢谢您的详细解释,@zivkan。NuGet.Server是否足以将其作为本地服务器修复?(或者我必须使用NuGet托管产品,比如Nexus Repository OSS吗?)任何实现NuGet协议的东西都可以。我链接的文档中列出的服务中至少有一半可以在本地托管,其中至少有一半是免费和/或开源的。