Кто-нибудь знает, как заставить Visual Studio применять конфигурацию источников пакетов NuGet для каждого решения, а не для всех решений? У меня проблемы с версированием, потому что я работаю над несколькими проектами, каждый из которых имеет свои собственные репозитории 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:
- Перейдите в% APPDATA%\NuGet и возьмите копию файла NuGet.config
- Выгрузите копию в корень вашего решения - то есть, где находится Application.sln.
- Переопределите значения по умолчанию, применяемые к вашему профилю пользователя, отредактировав копию, чтобы содержать только источники пакетов 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.