我有一个由多个站点共享的通用ASP.NET Web应用程序。我使用NuGet打包这个常见的Web应用程序并将其分发到多个站点。遵循这个想法:Multiple ASP.NET web applications depending on a common base application。
通过这样做,我最终遇到了一些问题。更新新版本时,NuGet变得非常慢。这是因为它包含800个内容文件。不知何故,NuGet每个内容文件需要大约1~2秒才能卸载,最后大约 25分钟用于卸载,5分钟用于安装。特别是TFS绑定。看一下NuGet的源代码,我发现NuGet正在谈论的Visual Studio的API是瓶颈。导致 Visual Studio 在整个过程中以 100%的CPU使用率达到峰值。
所以我想,如果Visual Studio那么慢,也许我可以在没有它的情况下做到这一点。令我失望的是NuGet命令行(没有Visual Studio运行)只下载一个包并解压缩它。它不会更新项目文件,因为一些Powershell脚本可以引用DTE对象...(虽然我没有)。
现在我想知道:我的选择是什么?
请帮我找到最佳解决方案:)
让我感到沮丧的另一件事是,在执行NuGet更新时,它会执行卸载,然后执行安装。为什么,如果版本之间的变化可能很小?
答案 0 :(得分:1)
一个选项是,您可以将它们作为资源嵌入共享库中,而不是添加800个内容文件。
然后使用类似EmbeddedResourceVirtualPathProvider
https://github.com/mcintyre321/EmbeddedResourceVirtualPathProvider的内容来提供服务。
这样NuGet只是替换.dll而不是800个单独的文件。
网上有很多关于如何使用VirtualPathProvider
的文章。
编辑:有关效果的问题
解决方案似乎相对简单,所以我只是尝试一下,看看性能是否可以接受。好消息是,您不必对Web应用程序中的路径执行任何特殊操作。
以下是您需要执行的步骤:
<Content
替换为<EmbeddedResource
来快速完成此操作。 EmbeddedResourceVirtualPathProvider
NuGet包添加到您的网络应用AppInitialize()
文件夹中的App_Code
进行注册的示例。namespace TestWebProject.App_Code
{
public class RegisterVirtualPathProvider
{
public static void AppInitialize()
{
HostingEnvironment.RegisterVirtualPathProvider(new EmbeddedResourceVirtualPathProvider.Vpp()
{
{typeof (Marker).Assembly, @"..\TestResourceLibrary"},
});
}
}
}