Пакет Nuget зависит от 1 из N пакетов Nuget?

Я работаю над проектом с открытым исходным кодом MvcSiteMapProvider, готовя его к развертыванию. Это пакет библиотеки, который поддерживает MVC2, MVC3 и MVC4, а также .NET 3.5, .NET 4.0 и .NET 4.5.

На основе Пакет Nuget: использовать другую версию MVC, когда она доступна, Я пришел к выводу, что мне нужно создать пакет Nuget для каждой версии MVC и позволить внутреннему обнаружению версии Nuget позаботиться о различных версиях .NET, например:

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

Однако помимо библиотеки DLL у меня есть разные файлы (конфигурация внедрения зависимостей, MVC DisplayTemplates и т. д.), которые необходимо развернуть в целевом проекте. Эти файлы НЕ ДОЛЖНЫ обновляться при обновлении новой версии основного проекта, потому что они, скорее всего, будут содержать правки конечного разработчика, которые я не хочу перезаписывать.

Итак, ясно, что по этой и другим причинам они должны быть в своих собственных пакетах Nuget. Однако эти другие пакеты должны зависеть от основных проектов MvcSiteMapProvider.MVCx, просто чтобы убедиться, что один из них установлен.

Нет смысла делать отдельный пакет Nuget для каждой версии MVC для каждого из этих других пакетов — все они абсолютно одинаковы, за исключением этой одной зависимости. В идеале я хотел бы сделать один пакет 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

person NightOwl888    schedule 07.06.2013    source источник


Ответы (1)


Глядя на ваш исходный код, кажется, что вы ссылается на несколько версии пакета Microsoft.AspNet.Mvc в проекте MvcSiteMapProvider. Я не уверен, что это работает так, как вы ожидаете, поскольку может быть только одна версия System.Web.Mvc, которую можно поместить в папку bin в процессе компиляции (будет использоваться последняя версия 5.0.0).

Таким образом, любой код в вашем пакете, который зависит от Mvc V3 или V4, на самом деле не получает ожидаемую dll.

Поскольку большинство пакетов, на которые вы ссылались выше, например Autofac, также имеют пакет интеграции, предназначенный для определенных версий MVC, у вас может не быть выбора, кроме как разделить пакет на более мелкие пакеты, как вы упомянули в своем посте.

Лучшим подходом к этой проблеме было бы разделение основных функций, предоставляемых вашим пакетом, которые не зависят от какой-либо версии MVC. Затем вы можете создавать различные пакеты-оболочки, которые зависят от вашего основного пакета, а также от конкретной версии Microsoft.AspNet.Mvc. И создание аналогичных пакетов для каждой другой конфигурации имеет зависимость nuget от сторонних пакетов, таких как Autofac (например, Autofac. Mvc5) и соответствующей версии вашего пакета MvcSiteMapProvider.MvcX.

person KnightFox    schedule 10.07.2015
comment
Спасибо. Я полагаюсь на условное поведение MSBuild для выберите соответствующие зависимости в зависимости от того, для какой версии MVC требуется сборка. Эта часть работает нормально. Моя проблема заключается в том, что нет возможности указать пакет X, Y или Z по мере необходимости и установить пакет Z, если ни один из них не установлен. В любом случае, этот вопрос спорный, поскольку я узнал, что это соответствующий контейнер< /а>. - person NightOwl888; 11.07.2015