3

我正在开发一个开源项目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 版本,如下所示:

  • MvcSiteMapProvider.MVC2
  • MvcSiteMapProvider.MVC3
  • MvcSiteMapProvider.MVC4

但是,除了库 DLL 之外,我还有不同的文件(依赖注入配置、MVC DisplayTemplates 等)需要部署到目标项目。当主项目的新版本更新时,这些文件不得更新,因为它们可能包含我不想覆盖的最终开发人员编辑。

因此,很明显,出于这个和其他原因,这些需要放在自己的 Nuget 包中。但是,这些其他包需要依赖于主 MvcSiteMapProvider.MVCx 项目,以确保已安装其中一个。

为每个 MVC 版本为每个其他包创建单独的 Nuget 包是没有意义的 - 除了这个依赖项之外,它们都完全相同。理想情况下,我想做的是制作一个依赖于 MvcSiteMapProvider.MVC2、MvcSiteMapProvider.MVC3 或 MvcSiteMapProvider.MVC4 的单个 Nuget 包,如果它们都不可用,请安装与目标项目的 MVC 版本匹配的包,但我将如何做到这一点?如果这是不可能的,除了创建大量 Nuget 包(每个 MVC 版本依赖项一个)之外,我还有什么其他选择,这些包随着每个新的 MVC 版本呈指数增长?

为了澄清,我还有其他这样的 Nuget 包:

  • MvcSiteMapProvider.Web
  • MvcSiteMapProvider.Configuration.Autofac
  • MvcSiteMapProvider.Configuration.Ninject
  • MvcSiteMapProvider.Configuration.StructureMap
  • MvcSiteMapProvider.Configuration.Unity
  • MvcSiteMapProvider.Configuration.Windsor

我试图避免将其更改为:

  • MvcSiteMapProvider.MVC2.Web
  • MvcSiteMapProvider.MVC2.Configuration.Autofac
  • MvcSiteMapProvider.MVC2.Configuration.Ninject
  • MvcSiteMapProvider.MVC2.Configuration.StructureMap
  • MvcSiteMapProvider.MVC2.Configuration.Unity
  • MvcSiteMapProvider.MVC2.Configuration.Windsor
  • MvcSiteMapProvider.MVC3.Web
  • MvcSiteMapProvider.MVC3.Configuration.Autofac
  • MvcSiteMapProvider.MVC3.Configuration.Ninject
  • MvcSiteMapProvider.MVC3.Configuration.StructureMap
  • MvcSiteMapProvider.MVC3.Configuration.Unity
  • MvcSiteMapProvider.MVC3.Configuration.Windsor
  • MvcSiteMapProvider.MVC4.Web
  • MvcSiteMapProvider.MVC4.Configuration.Autofac
  • MvcSiteMapProvider.MVC4.Configuration.Ninject
  • MvcSiteMapProvider.MVC4.Configuration.StructureMap
  • MvcSiteMapProvider.MVC4.Configuration.Unity
  • MvcSiteMapProvider.MVC4.Configuration.Windsor
4

1 回答 1

0

查看您的源代码,您似乎在 MvcSiteMapProvider 项目中引用了多个版本的 Microsoft.AspNet.Mvc 包。我不确定这是否按您的预期工作,因为在编译过程中只能将一个版本的 System.Web.Mvc 放入 bin 文件夹中(将使用最新版本 5.0.0)。

因此,您的包中依赖于 Mvc V3 或 V4 的任何代码都没有真正获得它期望的 dll。

由于您上面引用的大多数包(如 Autofac)也具有针对特定 MVC 版本的集成包,因此您可能别无选择,只能将包拆分成更小的包,就像您在帖子中提到的那样。

解决这个问题的一个更好的方法是分离你的包提供的核心功能,它不依赖于任何版本的 MVC。然后,您可以根据您的核心包以及特定版本的 Microsoft.AspNet.Mvc 创建不同的包装器包。并为每个不同的配置创建类似的包 对 Autofac (例如Autofac.Mvc5 )等第三方包及其相应版本的 MvcSiteMapProvider.MvcX 包有 nuget 依赖性

于 2015-07-10T20:23:06.747 回答