Есть ли способ настроить параметры источника пакета NuGet для каждого решения?

84

Кто-нибудь знает, как заставить Visual Studio применять конфигурацию источников пакетов NuGet для каждого решения, а не для всех решений? У меня продолжаются проблемы с версией, потому что я работаю над несколькими проектами, у каждого из которых есть свои частные репозитории NuGet. Трудно вспомнить, какое репо NuGet принадлежит какому проекту, и возвращаться назад и применять правильный репозиторий к правильному проекту.

БенАлабастер
источник
Не уверен, что вы имеете в виду. Вы можете настроить только источники пакетов nuget для всех решений. Ваш файл package.config будет содержать версии репозиториев nuget, которые нужны вашему проекту. Не обновлять автоматически. можешь привести пример того, что ты хочешь сделать.
Шьямал Десаи,
1
@Shyamal Я говорил об источниках пакетов NuGet, а не о самих пакетах ... Я понял, как это сделать.
BenAlabaster

Ответы:

138

TL; DR: Да

NuGet использует иерархическое приложение источников пакетов, начиная с NuGet.config на уровне вашего профиля пользователя Windows, а затем применяя все более и более детальную конфигурацию, начиная с корня пути к файлу, содержащего ваше решение, и, наконец, заканчивая каталогом, содержащим ваше решение. файл решения.

Итак, вот что мне удалось выяснить - любезно любезный Twitterer указал мне на этот документ:

https://docs.nuget.org/consume/nuget-config-file

Когда вы редактируете источники пакета NuGet в параметре Visual Studio Tools > NuGet Package Manager > Package Manager Settings: Package Sources, он применяет эти изменения по умолчанию к файлу NuGet.config, найденному в вашем %APPDATA%\NuGetкаталоге. Чтобы переопределить эти параметры для каждого решения (или для группы решений), вам необходимо добавить стратегически размещенный файл NuGet.config где-нибудь по пути к вашему решению или решениям.

Все станет ясно, если вы прочитаете документ NuGet, решение, которое я предлагаю ниже, быстро позволит вам указать конфигурацию для одного решения Visual Studio:

  1. Перейдите в% APPDATA% \ NuGet и возьмите копию NuGet.config.
  2. Выгрузите копию в корень вашего решения, то есть там, где находится Application.sln.
  3. Переопределите значения по умолчанию, примененные к вашему профилю пользователя, отредактировав копию, чтобы она содержала только те источники пакетов NuGet, которые имеют отношение к этому решению - например, частный источник NuGet, который содержит проприетарные пакеты для этого решения, но не должен применяться к другим проектам. - например:
<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>

  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>

  <packageSources>

    <!-- Ditch all the Global NuGet package sources we only want a 
         single private NuGet repo for this project -->
    <clear />

    <!-- Add the private NuGet package source for this solution -->
    <add key="My Private NuGet Server" value="http://myprivatenuget.com:8080/nuget" />

  </packageSources>

  <disabledPackageSources>

    <!-- Add any package sources to ignore here using the same keys as 
         defined in the packageSources list above-->

    <!--<add key="nuget.org" value="true" />-->

    <add key="Microsoft and .NET" value="true" />

  </disabledPackageSources>

</configuration>

Если вы хотите, чтобы конфигурация применялась к нескольким решениям, убедитесь, что все папки вашего решения содержатся в общем каталоге, и поместите NuGet.config для источников пакетов, относящихся к этим решениям, в этот общий каталог, гарантируя, что все папки решений для проектов, которые не «т использовать эти источники пакетов не содержится в этой общей папке.

БенАлабастер
источник
31
Спасибо, БенАлабастер. Если вы просто хотите, чтобы это было просто, вы можете просто иметь файл, содержащий только:<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="MyCompanyPackageSource" value="\\server\NuGet\MyCompany" /> </packageSources> </configuration>
Rubenisme
13
Возможно, вам придется закрыть и снова открыть Visual Studio, чтобы эти изменения вступили в силу. Я попытался закрыть свое решение, но этого оказалось недостаточно.
Джесс
1
хороший ответ, было бы лучше, если бы пример конфигурации был сокращен до того, что было необходимо. Также я пробовал с VS2015, и комментарий @Jess, похоже, больше не применяется, повторное открытие решения подобрало для меня новый источник пакета.
danio 09
6

Я хочу , чтобы добавить отличный ответ , предоставленный BenAlabaster . У меня была несколько противоположная проблема:

Компания глобально настроила свой собственный частный канал nuget для использования во всех решениях по умолчанию, и я хотел создать «прототип» приложения с использованием общедоступного канала nuget .

При этом (в каталоге этого решения) общедоступный канал nuget доступен только для моего конкретного решения, при этом канал компании остается по умолчанию для всех других решений:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <!-- Ditch all eventually upwards configured (private) feeds from an (enterprise) environment -->
    <clear />
    <!-- Make sure we use the public nuget -->
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <bindingRedirects>
    <add key="skip" value="False" />
  </bindingRedirects>
  <disabledPackageSources>
    <!-- Ditch all eventually upwards configured (private) feeds from an (enterprise) environment -->
    <clear />
  </disabledPackageSources>
</configuration>

Ключ состоял в том, чтобы очистить все отключенные вверх каналы , поскольку они намеренно отключили общедоступный канал в своем NuGet.config в% APPDATA% \ NuGet.

Марсель
источник