Чи є спосіб зробити налаштування джерела пакета NuGet для кожного рішення?


84

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


Не знаю, що ти маєш на увазі. Ви можете налаштувати лише джерела пакетів nuget для всіх рішень. Ваш файл package.config міститиме версії nuget-репозиторіїв, які вам потрібні. Не оновлювати автоматично. Чи можете ви навести приклад того, що ви хочете зробити?
Shyamal Desai,

1
@Shyamal Я говорив про джерела пакетів NuGet, а не про самі пакети ... Я зрозумів, як це зробити.
BenAlabaster,

Відповіді:


138

TLDR: Так

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
Дякую BenAlabaster. Якщо ви просто хочете зробити це простим, ви можете просто мати файл, що містить лише:<?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

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.