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

Работя върху проект с отворен код MvcSiteMapProvider, подготвяйки го за внедряване. Това е библиотечен пакет, който поддържа MVC2, MVC3 и MVC4, както и .NET 3.5, .NET 4.0 и .NET 4.5.

Въз основа на Nuget Package: Use Different MVC Version When Available, Стигнах до заключението, че трябва да направя пакет 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