Nuget包依赖于N个Nuget包中的1个?

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包没有意义——它们都完全相同,除了这个依赖关系。理想情况下,我想做的是制作一个单一的Nuget包,它依赖于MvcSiteMapProvider.MVC2、MvcSiteMapProvider.MVC3或MvcSiteMapProvider.MVC4,如果没有这些包中的任何一个可用,就安装与目标项目的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
1个回答

0

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

因此,您的软件包中依赖于Mvc V3或V4的任何代码实际上都没有得到它所期望的dll。

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

较好的解决方案是将您的软件包提供的核心功能与任何版本的MVC没有依赖的功能分开。然后,您可以创建依赖于核心软件包和特定版本的Microsoft.AspNet.Mvc的不同包装器软件包。并为每个不同的配置创建类似的软件包,这些配置具有依赖于第三方软件包(例如Autofac.Mvc5)及其相应版本的MvcSiteMapProvider.MvcX软件包。

谢谢。我依赖于MSBuild的条件行为,根据要构建的MVC版本选择适当的依赖项。那部分工作得很好。我的问题在于没有办法指定包X或Y或Z为必需,并在没有安装它们中的任何一个时安装包Z。无论如何,这个问题是无关紧要的,因为我已经了解到这是一个符合容器 - NightOwl888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接