Ist es möglich, den Speicherort von Paketen für NuGet zu ändern?

283

Ich habe für die meisten meiner Projekte die folgende Konvention:

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

Sie werden bemerken , dass ich nicht halten externe Bibliotheken innerhalb der Quellordner. Ich bin auch sehr an der Verwendung von NuGet interessiert, möchte diese externen Bibliotheken jedoch nicht im Quellordner haben. Verfügt NuGet über eine Einstellung zum Ändern des Verzeichnisses, in das alle Pakete geladen werden?

TheCloudlessSky
quelle
10
Ja Ja Ja! Dies ist genau die Projektstruktur, die ich verwende (oder fast), und ich habe mich immer gefragt, ob NuGet sie unterstützen könnte ...
Noldorin
Ich habe mit dieser folgenden Antwort ausführlich beschrieben, wie dies zu tun ist: stackoverflow.com/a/19466173/564726 . Sie müssen häufig die Option solutionDir aus dem Wiederherstellungsbefehl entfernen, damit sie ordnungsgemäß funktioniert.
BrutalDev
2
Ich habe die .sln auf die gleiche Ebene wie Ihre Ordner der obersten Ebene gestellt. :)
Ian Warburton

Antworten:

242

Es ist jetzt möglich zu steuern, in welchem ​​Ordner die Pakete installiert werden.

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

Bearbeiten: Siehe Phil Haacks Kommentar am 10. Dezember 2010 um 23:45 Uhr (im Arbeitselement / im obigen Link). Die Unterstützung ist teilweise in 1.0 implementiert, jedoch nicht dokumentiert.

Laut @dfowler: Fügen Sie eine nuget.config-Datei neben der Lösung hinzu:

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

Es gibt ein Nuget-Paket zum Erstellen der Überschreibung des Paketordners .

Update für Version 2.1

Wie Azat kommentierte, gibt es jetzt eine offizielle Dokumentation zur Steuerung der Paketpositionen. In den Versionshinweisen für 2.1 wird die folgende Konfiguration in einer Datei nuget.config angegeben (eine Beschreibung der gültigen Speicherorte für die Konfigurationsdateien und der Funktionsweise des hierarchischen Konfigurationsmodells finden Sie in den Versionshinweisen):

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

Dies würde den Paketordner für die Konfigurationsebene ändern, in der Sie die Datei abgelegt haben (Lösung, wenn Sie sie im Lösungsverzeichnis ablegen, Projekt im Projektverzeichnis usw.). Beachten Sie, dass in den Versionshinweisen Folgendes angegeben ist:

[...] Wenn sich unter Ihrem Lösungsstamm ein vorhandener Paketordner befindet, müssen Sie diesen löschen, bevor NuGet Pakete am neuen Speicherort ablegt.

PHeiberg
quelle
5
Es ist tatsächlich möglich, die obige Konfigurationsdatei zu verwenden. Der Grund, warum dies nicht besonders hervorgehoben wurde, liegt darin, dass wir den Workflow, dies über die Benutzeroberfläche und andere Mittel zu ermöglichen, noch nicht durchlaufen haben. Erwarten Sie daher eine gewisse Eigenart.
Davidfowl
5
Unter reviewboard.nupack.com/r/131 finden Sie eine vollständige Beschreibung der Funktionsweise von nuget.config durch @dfowler. Zum Beispiel würde eine gültige nuget.config folgendermaßen aussehen: <settings> <repositoryPath> lib </ repositoryPath> </ settings>
Lee Harold
1
Ich kann bestätigen, dass die neue Vorgehensweise in 2.1+ nicht funktioniert. Und es gibt Fehler in Codeplex: nuget.codeplex.com/workitem/2921 .
Fall
5
Die zweite Version funktioniert für mich, ich verwende das neueste NuGet und jetzt können zwei Lösungen dasselbe Repo verwenden. Ich denke, es kann einige Leute nicht funktionieren, weil sie absolute Pfade benutzen könnten? Es scheint, dass der absolute vs. relative Pfad wichtig ist.
Csaba Toth
63
  1. Erstellt eine Datei mit dem Namen "nuget.config".
  2. Diese Datei wurde meinem Lösungsordner hinzugefügt

das hat bei mir NICHT funktioniert:

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

das hat bei mir funktioniert:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>
ShaneKm
quelle
Hier gilt das gleiche. Die Konfiguration> config hat nicht funktioniert, die Einstellungen> repositoryPath jedoch.
Gene Reddick
Nur die zweite Lösung funktioniert: docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly
15
Dies hängt von der verwendeten NuGet-Version ab.
Bronumski
1
Beachten Sie, dass relative Pfade relativ zur Lösung sind. Wenn sich Ihre Projekte also auf verschiedenen Ebenen befinden, funktioniert dies nicht.
Neun Schwänze
2
Dies funktioniert gut für VIsual Studio 2013, aber wenn ich Visual Studio 2015 verwende, installiert es immer noch Pakete im
Paketordner
40

Okay, für alle anderen, die diesen Beitrag lesen - hier ist, was ich von den unzähligen Antworten oben verstehe:

  1. Die Datei nuget.config im Ordner .nuget ist relativ zu diesem Ordner. Dies ist wichtig, denn wenn Ihr neuer Ordner so etwas wie "../Packages" ist, wird er dort abgelegt, wo er immer sofort einsatzbereit ist. Wie @ bruce14 angibt, müssen Sie stattdessen '../../Packages' ausführen

  2. Ich konnte das neueste Nuget (2.8.5) nicht dazu bringen, einen Paketordner außerhalb des Standardverzeichnisses zu finden, ohne die Paketwiederherstellung zu aktivieren. Sobald Sie die Paketwiederherstellung aktiviert haben, sollte der Datei nuget.config im Ordner .nuget Folgendes hinzugefügt werden, um den Speicherort zu ändern:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
  3. (Dies ist wichtig.) Wenn Sie Änderungen am Speicherort des Paketordners in den Dateien nuget.config vornehmen, müssen Sie Visual Studio neu starten oder die Lösung schließen / neu laden, damit die Änderungen wirksam werden

Robert Petz
quelle
5
Vertrauen Sie mir, Ihr dritter Punkt hat mir den Tag gerettet. Ich war von den letzten 3 Stunden verrückt, bis ich Ihren dritten Punkt gelesen habe. : '(Vielen Dank, Bruder!
hellodear
24

Eine Lösung für Nuget 3.2 unter Visual Studio 2015 lautet:

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

Verwenden eines Schrägstrichs für den übergeordneten Ordner. Speichern Sie die obige Datei (nuget.config) im Lösungsordner.

Referenz finden Sie hier

phuongnd
quelle
Perfekt! Arbeiten für Visual Studio 2015 und Nuget Version 3.2.0.10516
Anon Dev
Sie scheinen einen Schrägstrich gemeint zu haben. Wenn sich die Lösung jedoch auf Windows befindet, wird dieser Schrägstrich möglicherweise zu einem Schrägstrich, oder der Schrägstrich war der Tippfehler und sollte sich in einen Schrägstrich ändern.
Gerard ONeill
Ich bin auf 2015 und ich muss .. \ .. \ Pakete verwenden, damit es einen Ordner nach oben geht.
Rhyous
1
../libDas ist ein Schrägstrich, kein Schrägstrich. Was meinst du?
jpmc26
Ja, es ist genau ein Schrägstrich. Aktualisierte Antwort
phuongnd
15

Die in den Versionshinweisen für 2.1 vorgeschlagene Lösung funktioniert nicht sofort. Sie haben vergessen zu erwähnen, dass es Code gibt:

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

    ...
}

was verhindert, dass es funktioniert. Um dies zu beheben, müssen Sie Ihre NuGet.targets-Datei ändern und den Parameter 'OutputDirectory' entfernen:

    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch)</RestoreCommand>

Wenn Sie nun irgendwo in NuGet.config die Konfiguration 'repositoryPath' hinzufügen (eine Beschreibung der gültigen Speicherorte für die Konfigurationsdateien finden Sie in den Versionshinweisen), werden alle Pakete an einem einzigen Speicherort wiederhergestellt, aber ... Ihre .csproj-Datei enthält Hinweise zu Assemblys, die als relative Pfade geschrieben wurden ...

Ich verstehe immer noch nicht, warum sie sich schwer getan haben, anstatt PackageManager zu ändern, damit es Hinweispfade relativ zu PackagesDir hinzufügt. Auf diese Weise habe ich manuell verschiedene Paketspeicherorte lokal (auf meinem Desktop) und auf dem Build Agent.

<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>
Dmitry Naumov
quelle
1
Du liegst absolut richtig. In meiner Firma verwenden wir tatsächlich eine Version von NuGet, die wir selbst modifiziert haben und die genau das tut, was Sie beschreiben, dh sie fügt HintPaths relativ zum Paketverzeichnis hinzu, nicht relativ zum Speicherort der Projektdatei. Das funktioniert einwandfrei. Leider haben wir nie versucht, die Änderungen, die wir an NuGet vorgenommen haben, an der offiziellen Version zu übernehmen, aber vielleicht ist es jetzt an der Zeit, dies zu tun ...
afrischke
1
@afrischke: das wäre toll wenn du das machen könntest. Vielen Dank. Irgendeine Idee, wann dies passieren könnte?
Sgtz
11

Wenn Sie zusätzlich zur Antwort von Shane Kms die Nuget-Paketwiederherstellung aktiviert haben, bearbeiten Sie die NuGet.config im Ordner .nuget wie folgt:

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

Beachten Sie das zusätzliche ".. \", da es vom .nuget-Ordner und nicht vom Lösungsordner zurückverfolgt wird.

Benutzer
quelle
9

Keine dieser Antworten hat bei mir funktioniert (Nuget 2.8.6), da einige Tipps fehlen. Ich werde versuchen, sie hier hinzuzufügen, da dies für andere nützlich sein könnte.

Nach dem Lesen der folgenden Quellen:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
Es scheint, dass

  1. Um die Arbeit Sie Install-Paket ordnungsgemäß mit verschiedenen repositoryPath verwenden müssen , um vorwärts Schrägstriche, es ist , weil sie verwenden Uri Objekt zu parsen Lage.
  2. Ohne $ am Anfang ignorierte es immer noch meine Einstellungen.
  3. NuGet speichert die Konfigurationsdatei im Cache, sodass Sie nach Änderungen die Lösung / VS neu laden müssen.
  4. Ich hatte auch ein seltsames Problem bei der Verwendung des Befehls NuGet.exe, um diese Option festzulegen, da meine globale NuGet.exe unter AppData \ Roaming \ NuGet geändert und dort Pakete wiederhergestellt wurden (da diese Datei eine höhere Priorität hat, nur raten).

Z.B

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

Sie können auch den NuGet-Befehl verwenden, um sicherzustellen, dass die Syntax wie folgt korrekt ist:

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config
Roman Badiornyi
quelle
8

Für .NET Core-Projekte und Visual Studio 2017 konnte ich alle Pakete auf dem relativen Pfad wiederherstellen, indem ich folgende Konfiguration bereitstellte:

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

Aufgrund meiner Erfahrung wurde der lib-Ordner auf derselben Ebene erstellt, auf der Nuget.config gefunden wurde, unabhängig davon, wo sich die sln-Datei befand. Ich habe getestet und das Verhalten ist für die Befehlszeilen-Dotnet-Wiederherstellung und die Wiederherstellung von Visual Studio 2017 gleich

Kirill Chilingarashvili
quelle
Ich habe es versucht. Ich habe den globalPackagesFolderSchlüssel auf den Paketordner meines Projekts gesetzt. Ich habe versucht, ein einzelnes Paket mit hinzuzufügen dotnet add package MyPackage. nuget.exehat das gesamte Framework von 83 .NET-Paketen in diesen Ordner heruntergeladen. Das habe ich nicht beabsichtigt. Ich wollte nur mein einzelnes MyPackage in meinem lokalen, quellengesteuerten Paketordner haben.
Wallace Kelly
TU DAS NICHT! Dies wird Ihre Festplatte ziemlich schnell überfordern, da die gesamten Framework-Pakete jedes Mal heruntergeladen werden, wenn Sie eine neue App erstellen.
Alaa Masoud
1
Gemäß dieser Antwort auf eine andere Frage: stackoverflow.com/a/47407399/4572240 "respositoryPath wird für packages.config-Projekte verwendet, globalPackagesFolder wird für PackageReference-Projekte verwendet".
Siderite Zackwehdex
7

Die Konfigurationsdatei in der akzeptierten Antwort funktioniert für mich in VS2012. Bei mir funktioniert es jedoch nur, wenn ich Folgendes mache:

  1. Erstellen Sie ein neues Projekt in VS.
  2. VS beenden - das scheint wichtig zu sein.
  3. Kopieren Sie die Konfigurationsdateien in den Projektordner.
  4. Starten Sie VS neu und fügen Sie Pakete hinzu.

Wenn ich diese Schritte befolge, kann ich einen freigegebenen Paketordner verwenden.

Harald
quelle
Nur durch einen Neustart von VS konnte ich dies zum Laufen bringen. Vermutlich wird es vom Paketmanager zwischengespeichert.
Filip
6

Um den Pfad für Projekte mit PackageReference anstelle von packages.config zu ändern, müssen Sie verwenden globalPackagesFolder

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

globalPackagesFolder (Projekte, die nur PackageReference verwenden)

Der Speicherort des standardmäßigen globalen Paketordners. Der Standardwert ist% userprofile% .nuget \ packages (Windows) oder ~ / .nuget / packages (Mac / Linux). Ein relativer Pfad kann in projektspezifischen nuget.config-Dateien verwendet werden. Diese Einstellung wird von der Umgebungsvariablen NUGET_PACKAGES überschrieben, die Vorrang hat.

repositoryPath (nur packages.config)

Der Speicherort, an dem NuGet-Pakete anstelle des Standardordners $ (Solutiondir) / packages installiert werden sollen. Ein relativer Pfad kann in projektspezifischen nuget.config-Dateien verwendet werden. Diese Einstellung wird von der Umgebungsvariablen NUGET_PACKAGES überschrieben, die Vorrang hat.

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

Ich habe Nuget.config neben meine Lösungsdatei gestellt und es hat funktioniert.

Manny
quelle
5

Noch ein kleiner Leckerbissen, den ich gerade entdeckt habe. (Dies mag so einfach sein, dass einige es nicht erwähnt haben, aber es war wichtig für meine Lösung.) Der Ordner "packages" befindet sich im selben Ordner wie Ihre SLN-Datei.

Wir haben unsere .sln-Datei verschoben und dann alle Pfade darin korrigiert, um die verschiedenen Projekte und voila zu finden! Unser Paketordner landete dort, wo wir ihn haben wollten.

NickNuke
quelle
4

UPDATE für VS 2017:

Es sieht so aus, als hätten die Leute im Nuget-Team endlich angefangen, Nuget selbst zu verwenden, was ihnen half, einige wichtige Dinge zu finden und zu reparieren. Jetzt (wenn ich mich nicht irre, da ich immer noch nicht auf VS 2017 migriert bin) ist das Folgende nicht mehr notwendig. Sie sollten in der Lage sein, den "repositoryPath" auf einen lokalen Ordner zu setzen, und es wird funktionieren. Sogar Sie können es überhaupt belassen, da der Wiederherstellungsspeicherort standardmäßig aus den Lösungsordnern auf Computerebene verschoben wurde. Wieder - ich habe es immer noch nicht alleine getestet

VS 2015 und früher

Nur ein Tipp zu anderen Antworten (speziell dies ):

Der Speicherort des NuGet-Paketordners kann über die Konfiguration geändert werden. VisualStudio verweist jedoch weiterhin relativ relativ auf Assemblys in diesem Ordner:

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

Um dies zu umgehen (bis zu einer besseren Lösung), habe ich den Befehl subst verwendet , um ein virtuelles Laufwerk zu erstellen, das auf einen neuen Speicherort des Ordners "Pakete" verweist:

subst N: C:\Development\NuGet\Packages

Wenn Sie nun ein neues NuGet-Paket hinzufügen, verwendet die Projektreferenz ihren absoluten Speicherort:

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

Hinweis:

  1. Ein solches virtuelles Laufwerk wird nach dem Neustart gelöscht. Stellen Sie daher sicher, dass Sie damit umgehen
  2. Vergessen Sie nicht, vorhandene Referenzen in Projektdateien zu ersetzen.
Kamarey
quelle
Ist das heute noch so? Ich meine, wir können den absoluten Standort nicht für neu hinzugefügte Pakete verwenden? Diese virtuelle Laufwerkslösung sieht für mich umständlich aus
Batmaci
Ja, immer noch ein Fall, da sich nichts geändert hat
Kamarey
2
Eigentlich bevorzuge ich einen relativen Pfad - auf diese Weise gibt es keinen Konflikt in der Quellcodeverwaltung, wenn verschiedene Entwickler unterschiedliche Stammspeicherorte für den Code haben.
10.
Ich frage mich, warum Sie nicht tun können, <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> anstatt zu verwendensubst
Vinod Srivastav
Ich wollte, dass alle Pakete an einem Ort sind, nicht pro Lösung
Kamarey
3

Nur mit Nuget 2.8.3 aktualisieren. Um den Speicherort der installierten Pakete zu ändern, habe ich die Paketwiederherstellung über die Rechtsklick-Lösung aktiviert. NuGet.Config bearbeitet und folgende Zeilen hinzugefügt:

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

Anschließend wurde die Lösung neu erstellt, alle Pakete in den gewünschten Ordner heruntergeladen und die Referenzen automatisch aktualisiert.

Amarnath Chatterjee
quelle