Как да зададете различни версии на nuget пакет за различни конфигурации на компилация?

Бих искал да посоча различни версии на пакети за различни конфигурации на проекти. Знам как би изглеждало това в моя .csproj файл за зависимости, различни от NuGet („голи“ DLL), но бих искал да опитам да накарам това да работи и с NuGet пакети.

Проблемът е, че зависимостите на NuGet са посочени в packages.config, а не във файла .csproj, където бих могъл да използвам атрибута MSBuild Condition. Това се усложнява от факта, че изглежда няма никаква документация за packages.config и атрибутите, които поддържа.

Може ли това да стане? как?


person Roman Starkov    schedule 09.03.2016    source източник


Отговори (3)


В 2019 PackageReference, който използва възела PackageReference за управление на зависимостите на NuGet директно във файловете на проекта (за разлика от отделен файл packages.config) можете да го направите.

<ItemGroup>
<!-- ... -->
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" Condition="'$(TargetFramework)' == 'net452'" />
<!-- ... -->
</ItemGroup>

За повече информация можете да проверите това връзка.

Visual Studio 2017 версия 15.7 и по-нови поддържа мигриране на проект от формата за управление packages.config към формата PackageReference.

person Anik Saha    schedule 11.01.2019

Това не се поддържа, доколкото ми е известно, с файла packages.config. Можете да имате само един пакет NuGet с конкретен идентификатор във файла packages.config на един проект.

Можете да имате различни NuGet пакети, ако имате различни проекти, всички споделящи едни и същи изходни файлове. Този подход обикновено се използва от автори на библиотеки, които имат специфични за платформата проекти, които се нуждаят от различни NuGet пакети. Всички файлове на проекта могат да живеят в една и съща директория с файл packages.config, наречен след проекта (напр. packages.MyProject.config).

Може да е по-лесно да не използвате NuGet за добавяне на сглобките към вашия проект. Просто използвайте NuGet, за да изтеглите пакетите с помощта на nuget install и след това директно препратете необходимите модули с условия.

person Matt Ward    schedule 09.03.2016

Това се поддържа напълно от MSBuild, въпреки че Visual Studio няма вградена поддръжка за него, така че изисква малко ръчно редактиране. Направихме това в проекта Mvifer norev>projectnorefollow поддържа MVC версии 2-5.

  <ItemGroup Condition=" $(DefineConstants.Contains('MVC2')) ">
    <Reference Include="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  </ItemGroup>
  <ItemGroup Condition=" $(DefineConstants.Contains('MVC3')) ">
    <!-- Due to the windows update MS14-059, we need this hack to ensure we can build MVC3 both on machines that have the update and those that don't -->
    <Reference Condition=" Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Condition=" !Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Razor.1.0.20105.408\lib\net40\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup Condition=" $(DefineConstants.Contains('MVC4')) ">
    <Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Razor.4.0.20715.0\lib\net40\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.WebPages.4.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup Condition=" $(DefineConstants.Contains('MVC5')) ">
    <Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Razor.3.0.0\lib\net45\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
  </ItemGroup>

Не можете да използвате и мениджъра на пакети NuGet. Можете да създадете различни фиктивни проекти за всяка конфигурация, която искате да поддържате, да инсталирате пакетите NuGet там и след това да копирате върху файловете с пакети, препратките в packages.config и препратките към тях във файла .csproj или .vbproj.

Неактивните файлове се показват с жълта икона, но проектът ще продължи да се компилира и изпълнява по този начин.

person NightOwl888    schedule 22.04.2017