我正在开发一个开源项目MvcSiteMapProvider,为部署做好准备。它是一个支持MVC2,MVC3和MVC4以及.NET 3.5,.NET 4.0和.NET 4.5的库包。
基于Nuget Package: Use Different MVC Version When Available,我得出结论,我需要为每个版本的MVC制作一个Nuget包,让Nuget的内部版本检测处理不同的.NET版本,如下所示:
但是,除了库DLL之外,我还有需要部署到目标项目的不同文件(依赖注入配置,MVC DisplayTemplates等)。当主版本的新版本更新时,这些文件绝不能更新,因为它们可能包含我不想覆盖的最终开发人员编辑。
因此,很明显,由于这个原因和其他原因,这些需要在他们自己的Nuget包中。但是,这些其他包需要依赖于主要的MvcSiteMapProvider.MVCx项目,只是为了确保其中一个已安装。
为每个其他软件包为每个版本的MVC创建一个单独的Nuget包是没有意义的 - 除了这一个依赖项之外它们都完全相同。理想情况下,我想要做的是创建一个依赖于MvcSiteMapProvider.MVC2,MvcSiteMapProvider.MVC3或MvcSiteMapProvider.MVC4的Nuget包,如果它们都不可用,请安装与目标项目的MVC版本匹配的那个,但我怎么做到这一点?如果那是不可能的,那么除了创建大量的Nuget包(每个MVC版本依赖一个)时,我还有什么其他选项,每个新的MVC版本会以指数方式增长?
为了澄清,我还有其他像这样的Nuget包:
我试图避免将其更改为:
答案 0 :(得分:0)
查看源代码,您似乎是MvcSiteMapProvider项目中Microsoft.AspNet.Mvc包的referencing multiple versions。我不确定这是否按预期工作,因为在编译过程中只能有一个版本的System.Web.Mvc可以放在bin文件夹中(将使用最新版本5.0.0)。 / p>
因此,你的软件包中依赖于Mvc V3或V4的任何代码都没有真正获得它所期望的dll。
由于您在上面引用的大多数软件包(如Autofac)也具有针对特定MVC版本的集成软件包,因此您可能没有选择,只能将软件包拆分为较小的软件包,就像您在帖子中提到的那样。
解决此问题的更好方法是分离您的程序包提供的Core功能,该功能不依赖于任何版本的MVC。然后,您可以创建依赖于您的核心包以及特定版本的Microsoft.AspNet.Mvc的不同包装程序包。并为每个不同的配置创建类似的包具有对第三方软件包(如Autofac)(例如Autofac.Mvc5)及其相应版本的MvcSiteMapProvider.MvcX软件包的nuget依赖性