Czy możliwa jest zmiana lokalizacji pakietów dla NuGet?

Mam następującą konwencję dla większości moich projektów:

/src
    /Solution.sln
    /SolutionFolder
        /Project1
        /Project2
        /etc..
/lib
    /Moq
        moq.dll
        license.txt
    /Yui-Compressor
        yui.compressor.dll
/tools
    /ILMerge
        ilmerge.exe

Zauważysz, że nie przechowuję zewnętrznych bibliotek w folderze źródłowym. Jestem również bardzo zainteresowany używaniem NuGet, ale nie chcę tych zewnętrznych bibliotek w folderze źródłowym. Czy NuGet ma ustawienie pozwalające zmienić katalog, do którego ładowane są wszystkie pakiety?

Author: Lorenzo, 2010-11-03

15 answers

Teraz można kontrolować, w którym folderze zainstalowane są pakiety.

Http://nuget.codeplex.com/workitem/215

Edit: Zobacz komentarz Phila Haacka 10 grudnia 2010 o godzinie 23: 45 (w pozycji praca / link powyżej). Wsparcie jest częściowo zaimplementowane w wersji 1.0, ale nie jest udokumentowane.

Według @dfowler: Dodaj samorodek.plik konfiguracyjny obok rozwiązania z tym:

<settings>
<repositoryPath>{some path here}</repositoryPath>
</settings>

Istnieje pakiet nuget do tworzenia pakietu nadpisywanie folderów.

Aktualizacja dla wersji 2.1

Jak skomentował Azat, istnieje teraz oficjalna dokumentacja jak kontrolować lokalizacje pakietów. Informacje o wydaniu dla wersji 2.1 określają następującą konfigurację w nugecie.plik konfiguracyjny (zobacz Uwagi do wydania, aby uzyskać opis ważnych miejsc do umieszczenia plików konfiguracyjnych i jak działa hierarchiczny model konfiguracji):

<configuration>
  <config>
    <add key="repositoryPath" value="C:\thePathToMyPackagesFolder" />
  </config>
  ... 
</configuration>

Spowoduje to zmianę folderu packages dla poziomu konfiguracji, który umieściłeś plik w (rozwiązanie, jeśli umieścisz go w katalogu rozwiązania, projekt w katalogu projektu i tak dalej). Zauważ, że w Uwagach do wydania jest napisane:

[...] jeśli pod twoim rozwiązaniem znajduje się istniejący folder packages root, musisz go usunąć zanim NuGet umieści pakiety w nowa lokalizacja.

 245
Author: PHeiberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 06:54:43
  1. stworzył plik o nazwie " nuget.config".
  2. dodano ten plik do folderu Moje rozwiązania

To mi nie wyszło:

<configuration>
  <config>
    <add key="repositoryPath" value="..\ExtLibs\Packages" />
  </config>
  ... 
</configuration>

To mi się udało:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>
 65
Author: ShaneKm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 07:42:46

Ok ze względu na to, że ktoś jeszcze czyta ten post - oto co rozumiem z mnóstwa odpowiedzi powyżej:

  1. Nuget.plik konfiguracyjny w .folder nuget jest względny do tego folderu. Jest to ważne, ponieważ jeśli twój nowy folder to coś w stylu '../ Paczki", które umieszczą go tam, gdzie zawsze wychodzi z pudełka. Jak twierdzi @ bruce14 musisz to zrobić"../../ Pakiety " zamiast

  2. Nie mogę pobrać najnowszego nuget (2.8.5), aby znaleźć folder packages poza standardową lokalizacją bez włączania przywracania pakietu. Więc po włączeniu przywracania pakietu należy dodać następujące elementy do nuget.plik konfiguracyjny wewnątrz .folder nuget do zmiany lokalizacji:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
    
  3. (jest to ważne) W przypadku wprowadzenia jakichkolwiek zmian w lokalizacji folderu pakietu wewnątrz nugeta.pliki konfiguracyjne muszą ponownie uruchomić visual studio lub zamknąć / przeładować rozwiązanie, aby zmiany weszły w życie

 42
Author: Robert Petz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-20 23:24:23

Rozwiązanie dla Nuget 3.2 Na Visual Studio 2015 to:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="../lib" />
    </config>
</configuration>

Używanie ukośnika w folderze nadrzędnym. Zapisz powyższy plik (nuget.config) w folderze rozwiązanie.

Referencja jest dostępna tutaj

 25
Author: phuongnd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 15:30:28

Rozwiązanie zaproponowane w Uwagach do wydania 2.1 nie działa od razu. Zapomnieli wspomnieć, że istnieje kod:

internal string ResolveInstallPath()
{
    if (!string.IsNullOrEmpty(this.OutputDirectory))
    {
        return this.OutputDirectory;
    }
    ISettings settings = this._configSettings;

    ...
}
Co uniemożliwia jego działanie. Aby to naprawić, musisz zmodyfikować swój NuGet.plik docelowy i usuń parametr 'OutputDirectory':
    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch)</RestoreCommand>

Więc teraz, jeśli dodać' repositoryPath ' config gdzieś w NuGet.config (zobacz Uwagi do wydania, aby zobaczyć opis ważnych miejsc, aby umieścić pliki konfiguracyjne), przywróci wszystkie pakiety w jednej lokalizacji, ale... Twoje .csproj nadal zawiera wskazówki do zespołów zapisanych jako ścieżki względne...

Nadal nie rozumiem, dlaczego nie zmienili Packagemanagera tak, aby dodawał ścieżki podpowiedzi względem PackagesDir. Tak robię ręcznie , aby mieć różne lokalizacje pakietów lokalnie (na moim pulpicie) i w build agencie.

<Reference Include="Autofac.Configuration, Version=2.6.3.862, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>$(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll</HintPath>
</Reference>
 16
Author: Dmitry Naumov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 08:54:00

Oprócz odpowiedzi Shane Kms, jeśli aktywowałeś Przywracanie pakietu Nuget, edytujesz NuGet.config znajduje się w .nuget-folder w następujący sposób:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <repositoryPath>..\..\ExtLibs\Packages</repositoryPath>
</configuration>

Zwróć uwagę na dodatkowe "..\ ", jak to się mówi z .nuget-folder, a nie folder rozwiązania.

 12
Author: user,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-25 12:37:27

Żadna z tych odpowiedzi nie działa dla mnie (Nuget 2.8.6) z powodu braku niektórych wskazówek, postaram się dodać je tutaj, ponieważ może być przydatna dla innych.

Po przeczytaniu następujących źródeł:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
Wygląda na to, że

  1. aby poprawnie działać Install-Package z różnymi repositoryPath musisz użyć forward ukośników, to dlatego, że do analizy lokalizacji używa obiektu Uri.
  2. BEZ $ na początku nadal ignorował Moje ustawienia.
  3. NuGet buforuje plik konfiguracyjny, więc po modyfikacjach trzeba przeładować rozwiązanie / VS.
  4. miałem też dziwny problem podczas używania komendy NuGet.exe, aby ustawić tę opcję, ponieważ zmodyfikował mój globalny NuGet.exe pod AppData \ Roaming\NuGet i zaczął tam przywracać pakiety (ponieważ ten plik ma wyższy priorytet, tylko zgaduję).

Np.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
  <config>
    <add key="repositorypath" value="$/../../../Common/packages" />
  </config>
</configuration>

Możesz również użyć polecenia NuGet, aby upewnić się, że składnia będzie poprawna w następujący sposób:

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config
 10
Author: Roman Badiornyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 13:49:59

W celu zmiany ścieżki dla projektów za pomocą PackageReference zamiast pakietów.config musisz użyć globalPackagesFolder

Z https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

GlobalPackagesFolder (projekty wykorzystujące tylko PackageReference)

Lokalizacja domyślnego folderu global packages. Domyślną wartością jest % userprofile%.nuget\packages (Windows) lub ~/.nuget / Pakiety (Mac/Linux). Ścieżka względna może być użyta w specyfika projektu nuget.pliki konfiguracyjne. To ustawienie jest nadpisywane przez nuget_packages zmienna środowiskowa, która ma pierwszeństwo.

RepositoryPath (packages.tylko config)

Miejsce, w którym należy zainstalować pakiety NuGet zamiast domyślnej $(Solutiondir) / packages folder. Ścieżka względna może być używana w nuget specyficznym dla projektu.config pliki. To ustawienie jest nadpisywane przez środowisko NUGET_PACKAGES zmienna, która zajmuje pierwszeństwo.

<config>
    <add key="globalPackagesFolder" value="c:\packageReferences" />
    <add key="repositoryPath" value="c:\packagesConfig" />
</config>

I put Nuget.config obok mojego pliku rozwiązania i to działało.

 10
Author: Manny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-23 19:01:57

W przypadku projektów. NET Core i Visual Studio 2017 udało mi się przywrócić wszystkie pakiety do ścieżki względnej, podając taką konfigurację:

<configuration>
  <config>
    <add key="globalPackagesFolder" value="lib" />
  </config>
  ... 
</configuration>

Na podstawie mojego doświadczenia folder lib został utworzony na tym samym poziomie, na którym Nuget.config został znaleziony, bez względu na to, gdzie był plik sln. Testowałem i zachowanie jest takie samo dla wiersza poleceń dotnet restore i Visual Studio 2017 rebuild

 9
Author: Kirill Chilingarashvili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-09 15:12:19

Plik konfiguracyjny w zaakceptowanej odpowiedzi działa dla mnie w VS2012. Jednak dla mnie to tylko działa, gdy wykonuję następujące czynności:

  1. Utwórz nowy projekt W VS.
  2. Exit VS-to wydaje się być ważne.
  3. skopiuj pliki konfiguracyjne do folderu projektu.
  4. Uruchom ponownie VS i dodaj Pakiety.

Jeśli wykonam te kroki, mogę użyć folderu shared package.

 8
Author: Harald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-26 07:10:55

Jeszcze jedna mała ciekawostka, którą właśnie odkryłem. (Może to być tak proste, że niektórzy o tym nie wspominali, ale było to ważne dla mojego rozwiązania.) Folder "packages" kończy się w tym samym folderze co twój .plik sln.

Przenieśliśmy nasze .plik sln, a następnie Naprawiono wszystkie ścieżki wewnątrz, aby znaleźć różne projekty i voila! Nasz folder z pakietami znalazł się tam, gdzie chcieliśmy.

 6
Author: NickNuke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 16:00:11

Aktualizacja dla VS 2017:

Wygląda ludzie z zespołu NuGet w końcu zaczęli używać Nuget sami, co pomogło im znaleźć i naprawić kilka ważnych rzeczy. Tak więc teraz (jeśli się nie mylę, ponieważ nadal nie migrował do VS 2017) poniżej nie jest już konieczne. Powinieneś być w stanie ustawić "repositoryPath" do folderu lokalnego i będzie działać. Możesz nawet pozostawić go w ogóle jako domyślną lokalizację przywracania przeniesioną z folderów rozwiązania na poziom Maszyny. Znowu-nadal nie testowałem it by myself

VS 2015 i wcześniej

Tylko podpowiedź do innych odpowiedzi (konkretnie to):

Lokalizacja folderu pakietu NuGet może być zmieniona poprzez konfigurację, ale VisualStudio nadal odwołuje się do zestawów w tym folderze:

<HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Aby obejść to (do czasu lepszego rozwiązania) użyłem subst aby utworzyć wirtualny napęd, który wskazuje na nową lokalizację folderu Packages:

subst N: C:\Development\NuGet\Packages

Teraz przy dodawaniu nowego NuGet package, the project reference use its absolute location:

<HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Uwaga:

  1. taki wirtualny dysk zostanie usunięty po ponownym uruchomieniu, więc upewnij się, że zajmij się nim
  2. nie zapomnij zastąpić istniejących odniesień w plikach projektu.
 5
Author: Kamarey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-13 12:57:12

Najbardziej spójnym sposobem jest użycie nuget config do jawnego ustawienia config:

nuget config -set repositoryPath=c:\packages -configfile c:\my.config

Https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior#changing-config-settings

 5
Author: yeerk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-11 16:35:38

Właśnie aktualizuję Nuget 2.8.3. Aby zmienić lokalizację zainstalowanych pakietów , włączyłem przywracanie pakietów z kliknięciem prawym przyciskiem myszy rozwiązanie. Edited NuGet.Config i dodano te linie:

  <config>
    <add key="repositorypath" value="..\Core\Packages" />
  </config>

Następnie przebudowano rozwiązanie, pobrano wszystkie pakiety do pożądanego folderu i zaktualizowano referencje automatycznie.

 4
Author: amarnath chatterjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-09 06:09:34
  1. Utwórz nuget.config w tym samym katalogu, w którym znajduje się plik rozwiązania, o następującej treści:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositoryPath" value="packages" />
  </config>
</configuration>

'packages' będzie to folder, w którym zostaną przywrócone wszystkie pakiety.

  1. Zamknij rozwiązanie Visual studio i otwórz je ponownie.
 0
Author: TarmoPikaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-21 17:20:31