Czy istnieje sposób na skonfigurowanie ustawień źródła pakietu NuGet na rozwiązanie?

84

Czy ktoś wie, jak sprawić, by program Visual Studio zastosował konfigurację źródeł pakietów NuGet na rozwiązanie zamiast we wszystkich rozwiązaniach? Ciągle mam problemy z wersjonowaniem, ponieważ pracuję nad wieloma projektami, z których każdy ma własne prywatne repozytoria NuGet. Uciążliwe jest ciągłe pamiętanie, które repozytorium NuGet należy do którego projektu i cofanie się i stosowanie poprawnego do właściwego projektu.

BenAlabaster
źródło
Nie wiem co masz na myśli. Można skonfigurować tylko źródła pakietów NuGet dla wszystkich rozwiązań. Plik package.config będzie zawierał wersje repozytoriów NuGet, których potrzebuje Twój projekt. Nie aktualizuj automatycznie. czy możesz podać przykład tego, co chcesz zrobić.
Shyamal Desai
1
@Shyamal Mówiłem o źródłach pakietów NuGet, a nie o samych pakietach ... Pomyślałem, jak to zrobić.
BenAlabaster,

Odpowiedzi:

138

TLDR: tak

NuGet używa hierarchicznej aplikacji źródeł pakietów, zaczynając od NuGet.config na poziomie profilu użytkownika systemu Windows, a następnie stosując coraz bardziej szczegółową konfigurację, zaczynając od katalogu głównego ścieżki pliku zawierającej rozwiązanie, a na końcu kończąc na katalogu zawierającym plik rozwiązania.

Oto, co udało mi się rozgryźć - dzięki uprzejmości pomocnego Twitterera wskazującego mi ten dokument:

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

Podczas edytowania źródeł pakietów NuGet w opcji programu Visual Studio Tools > NuGet Package Manager > Package Manager Settings: Package Sourceste zmiany są domyślnie stosowane do pliku NuGet.config znajdującego się w %APPDATA%\NuGetkatalogu. Aby zastąpić te ustawienia dla poszczególnych rozwiązań (lub grup rozwiązań), należy dodać strategicznie umieszczony plik NuGet.config w dowolnym miejscu na ścieżce rozwiązania lub rozwiązań.

Wszystko stanie się jasne, jeśli przeczytasz dokument NuGet, rozwiązanie, które podaję poniżej, pozwoli szybko określić konfigurację dla pojedynczego rozwiązania Visual Studio:

  1. Przejdź do% APPDATA% \ NuGet i pobierz kopię NuGet.config
  2. Zrzuć kopię w katalogu głównym swojego rozwiązania - tj. Tam, gdzie znajduje się Application.sln.
  3. Zastąp ustawienia domyślne zastosowane do profilu użytkownika, edytując kopię tak, aby zawierała tylko źródła pakietów NuGet, które są odpowiednie dla tego rozwiązania - na przykład prywatne źródło NuGet, które zawiera zastrzeżone pakiety dla tego rozwiązania, ale nie powinno być stosowane do innych projektów - na przykład:
<?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>

Jeśli chcesz konfiguracja zastosować do wielu rozwiązań, zapewniają rozwiązanie foldery są wszystkie zawarte w ramach wspólnego katalogu i umieścić NuGet.config dla źródeł pakietów odpowiednich dla tych rozwiązań w tym wspólnym katalogu, zapewniając, że wszelkie foldery rozwiązanie dla projektów, które aren „t do korzystania z tych źródeł pakietów nie są zawarte w niniejszym wspólnym folderze.

BenAlabaster
źródło
31
Dzięki BenAlabaster. Jeśli chcesz to <?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="MyCompanyPackageSource" value="\\server\NuGet\MyCompany" /> </packageSources> </configuration>
uprościć
13
Aby te zmiany zaczęły obowiązywać, może być konieczne zamknięcie i ponowne otwarcie programu Visual Studio. Próbowałem zamknąć moje rozwiązanie i to nie wystarczyło.
Jess
1
dobra odpowiedź, byłoby lepiej, gdyby przykładowa konfiguracja została ograniczona do tego, co było potrzebne. Próbowałem również z VS2015 i komentarz @Jessa nie wydaje się już mieć zastosowania, ponowne otwarcie rozwiązania wybrało dla mnie nowe źródło pakietu.
danio
6

Chcę dodać do doskonałej odpowiedzi udzielonej przez BenAlabaster . Miałem nieco odwrotny problem:

Firma globalnie skonfigurowała swój niestandardowy prywatny kanał nuget do użytku we wszystkich rozwiązaniach domyślnie, a ja chciałem utworzyć „prototypową” aplikację przy użyciu publicznego źródła nuget .

Dzięki temu (w katalogu tego rozwiązania) publiczny kanał nuget jest dostępny tylko dla mojego konkretnego rozwiązania, zachowując kanał firmy jako domyślny dla wszystkich innych rozwiązań:

<?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>

Kluczem było wyczyszczenie wszystkich wyłączonych źródeł danych w górę , ponieważ celowo wyłączyli publiczny kanał informacyjny w swoim NuGet.config w% APPDATA% \ NuGet.

Marcel
źródło