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

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

Ответ 1

TL;DR: Да

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

Итак, вот что мне удалось выяснить - любезность полезного Твиттера, указывающего мне на этот документ:

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

Ответ 2

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

Компания по всему миру настроила собственный пользовательский канал nuget для использования по всем решениям по умолчанию, и я хотел создать приложение "prototype", используя публичный фид 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.