Einrichten eines gemeinsamen Ordners für Nuget-Pakete für alle Lösungen, wenn einige Projekte in mehreren Lösungen enthalten sind

137

Ich habe NuGet verwendet, um Pakete aus externen und internen Paketquellen abzurufen, was sehr praktisch ist. Ich habe jedoch festgestellt, dass die Pakete standardmäßig pro Lösung gespeichert werden. Dies ist sehr frustrierend, wenn einige Projekte mit NuGet-Referenzen in mehreren Lösungen enthalten sind. Anschließend werden die Verweise in einen anderen Lösungspaketordner geändert, der für einen anderen Entwickler oder Build-Computer möglicherweise nicht verfügbar ist.

Ich habe gesehen, dass es mit Release 2.1 von NuGet Möglichkeiten gibt, auf einen gemeinsamen Paketspeicherort hinzuweisen (möglicherweise verwenden wir auf Projektstammebene die TFS-Quellcodeverwaltung), siehe Versionshinweise . Ich verwende NuGet v2.7

Ich habe jedoch versucht, nuget.config-Dateien hinzuzufügen, ohne dass dies Auswirkungen hat. Pakete werden weiterhin im Lösungsordner gespeichert. Gibt es etwas, das ich vermisst habe? Es scheint unterschiedliche Strukturen des XML-Knotens zu geben, die der Datei nuget.config hinzugefügt werden können, je nachdem, wer diese Frage beantwortet: Schwarzie schlägt einen anderen Stackoverflow-Thread vor :

<settings>
  <repositoryPath>..\..\[relative or absolute path]</repositoryPath>
</settings>

Die Versionshinweise für NuGet 2.1 (siehe Link oben) schlagen dieses Format vor:

<configuration>
  <config>
    <add key="repositoryPath" value="..\..\[relative or absolute path]" />
  </config>
</configuration>

Ich weiß nicht, welche davon oder welche oder beide am Ende funktionieren werden. Ich habe beide auf Lösungsebene ausprobiert. Kann die Datei nuget.config im Stammverzeichnis des TFS-Projekts abgelegt werden oder muss sie sich im Lösungsverzeichnis befinden? Es scheint, dass NuGet die Einstellungen aus diesen Dateien in einer bestimmten Reihenfolge liest und anwendet, weshalb es sinnvoll wäre, sie in mehreren Ebenen hinzuzufügen, wobei eine nuget.config-Datei auf Lösungsebene eine auf der TFS-Projektstammebene überschreiben würde. Kann das geklärt werden?

Muss ich alle installierten Pakete entfernen, bevor diese Referenzen funktionieren? Ich würde mich freuen, wenn jemand eine schrittweise Anleitung für den Übergang von der lösungsspezifischen Nuget-Verwendung in einen gemeinsamen Paketordner bereitstellen könnte, in dem Projekte, die zu mehreren Lösungen gehören, die erforderlichen Nuget-Pakete finden können.

Mats Isaksson
quelle
3
Ich vermute, dass die kurze Antwort auf Ihre Frage (versteckt in Vermis 'Antwort unten) darin besteht, dass Sie den $vor dem relativen Pfad fehlenden verpasst haben . Auch ist die Antwort auf Ihre Frage zu NuGet.Config Dateien hier . Es wird zuerst in .nuget, dann in allen übergeordneten Verzeichnissen und dann in der 'globalen' Datei in Ihren AppData angezeigt. Anschließend werden sie in der Reihenfolge REVERSE angewendet (was auch immer das bedeutet).
Benjol
Das scheint schwer zu sein. Es gibt ein Tool namens Paket, das eine Lösung für dieses Problem sein könnte: fsprojects.github.io/Paket
Tuomas Hietanen
Später Kommentar. Ich wollte nur hinzufügen, dass Visual Studio neu gestartet werden muss, wenn es beim Starten dieser Änderung ausgeführt wird, da die Dateien nuget.config während des VS-Starts gelesen zu werden scheinen. Auch ohne das $ hatte ich kein Problem, fange einfach nicht mit einem Backslash an.
MBWise

Antworten:

147

Ich habe eine ähnliche Situation mit externen und internen Paketquellen mit Projekten, auf die in mehr als einer Lösung verwiesen wird. Ich habe dies heute mit einer unserer Codebasen zum Laufen gebracht und es scheint mit den Entwickler-Workstations und unserem Build-Server zu funktionieren. Der folgende Prozess berücksichtigt dieses Szenario (obwohl es nicht schwierig sein sollte, den allgemeinen Paketordner an einem anderen Ort anzupassen).

  • Codebasis
    • Projekt A.
    • Projekt B.
    • Projekt C.
    • Lösungen
      • Lösung 1
      • Lösung 2
      • Lösung 3
      • Pakete (dies ist das gemeinsame Paket, das von allen Lösungen gemeinsam genutzt wird)

Aktualisierte Antwort ab NuGet 3.5.0.1484 mit Visual Studio 2015 Update 3

Dieser Prozess ist jetzt etwas einfacher als damals, als ich dies ursprünglich in Angriff genommen habe und dachte, es sei Zeit, dies zu aktualisieren. Im Allgemeinen ist der Prozess der gleiche, nur mit weniger Schritten. Das Ergebnis ist ein Prozess, der Folgendes löst oder bereitstellt:

  • Alles, was für die Quellcodeverwaltung festgeschrieben werden muss, ist in der Lösung sichtbar und wird nachverfolgt
  • Beim Installieren neuer Pakete oder Aktualisieren von Paketen mithilfe des Paketmanagers in Visual Studio wird der richtige Repository-Pfad verwendet
  • Nach der Erstkonfiguration kein Hacken von .csproj-Dateien
  • Keine Änderungen an der Entwickler-Workstation (Code wird beim Auschecken erstellt)

Es gibt einige mögliche Nachteile, die zu beachten sind (ich habe sie noch nicht erlebt, YMMV). Siehe Benols Antwort und Kommentare unten.

Fügen Sie NuGet.Config hinzu

Sie möchten eine NuGet.Config-Datei im Stammverzeichnis des Ordners \ Solutions \ erstellen. Stellen Sie sicher, dass es sich um eine UTF-8-codierte Datei handelt, die Sie erstellen. Wenn Sie sich nicht sicher sind, wie Sie dies tun sollen, verwenden Sie das Menü Datei-> Neu-> Datei von Visual Studio und wählen Sie dann die XML-Dateivorlage aus. Fügen Sie NuGet.Config Folgendes hinzu:

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

Für die Einstellung repositoryPath können Sie mit dem Token $ einen absoluten Pfad oder einen relativen Pfad (empfohlen) angeben. Das $ -Token basiert darauf, wo sich die NuGet.Config befindet (Das $ -Token bezieht sich tatsächlich auf eine Ebene unterhalb der Position der NuGet.Config). Wenn ich also \ Solutions \ NuGet.Config habe und \ Solutions \ Packages möchte, muss ich $ \ .. \ Packages als Wert angeben.

Als Nächstes möchten Sie Ihrer Lösung einen Lösungsordner mit dem Namen "NuGet" hinzufügen (Klicken Sie mit der rechten Maustaste auf Ihre Lösung, Hinzufügen-> Neuer Lösungsordner). Lösungsordner sind virtuelle Ordner, die nur in der Visual Studio-Lösung vorhanden sind und keinen tatsächlichen Ordner auf dem Laufwerk erstellen (und Sie können von überall auf Dateien verweisen). Klicken Sie mit der rechten Maustaste auf Ihren "NuGet" -Lösungsordner und dann auf Hinzufügen-> Vorhandenes Element und wählen Sie \ Solutions \ NuGet.Config.

Der Grund, warum wir dies tun, ist, dass es in der Lösung sichtbar ist und dabei helfen soll, sicherzustellen, dass es ordnungsgemäß für Ihre Quellcodeverwaltung verwendet wird. Möglicherweise möchten Sie diesen Schritt für jede Lösung in Ihrer Codebasis ausführen, die an Ihren freigegebenen Projekten teilnimmt.

Indem wir die NuGet.Config-Datei in \ Solutions \ über alle .sln-Dateien platzieren, nutzen wir die Tatsache, dass NuGet rekursiv aus dem "aktuellen Arbeitsverzeichnis" in der Ordnerstruktur nach oben navigiert und nach einer zu verwendenden NuGet.Config-Datei sucht. Das "aktuelle Arbeitsverzeichnis" bedeutet hier ein paar verschiedene Dinge, einer ist der Ausführungspfad von NuGet.exe und der andere ist der Speicherort der SLN-Datei.

Umschalten Ihres Paketordners

Zunächst empfehle ich dringend, dass Sie jeden Ihrer Lösungsordner durchsuchen und alle vorhandenen \ Packages \ -Ordner löschen (Sie müssen zuerst Visual Studio schließen). Auf diese Weise können Sie leichter erkennen, wo NuGet Ihren neu konfigurierten Ordner \ Packages \ ablegt, und sicherstellen, dass alle Links zu falschen Ordnern \ Packages \ fehlschlagen und dann behoben werden können.

Öffnen Sie Ihre Lösung in Visual Studio und starten Sie ein Rebuild All. Ignorieren Sie alle Build-Fehler, die Sie erhalten. Dies wird an dieser Stelle erwartet. Dies sollte jedoch die NuGet-Paketwiederherstellungsfunktion zu Beginn des Erstellungsprozesses starten. Stellen Sie sicher, dass Ihr Ordner \ Solutions \ Packages \ an der gewünschten Stelle erstellt wurde. Wenn dies nicht der Fall ist, überprüfen Sie Ihre Konfiguration.

Nun möchten Sie für jedes Projekt in Ihrer Lösung:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Projekt entladen
  2. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Edit your-xxx.csproj
  3. Suchen Sie nach Verweisen auf \ packages \ und aktualisieren Sie sie auf den neuen Speicherort.
    • Die meisten davon sind <HintPath> -Referenzen, aber nicht alle. Beispielsweise verfügen WebGrease und Microsoft.Bcl.Build über separate Pfadeinstellungen, die aktualisiert werden müssen.
  4. Speichern Sie die .csproj-Datei, klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Projekt neu laden

Sobald alle Ihre .csproj-Dateien aktualisiert wurden, starten Sie einen weiteren Rebuild All, und Sie sollten keine Build-Fehler mehr über fehlende Referenzen haben. Zu diesem Zeitpunkt sind Sie fertig und haben NuGet für die Verwendung eines freigegebenen Paketordners konfiguriert.

Ab NuGet 2.7.1 (2.7.40906.75) mit VStudio 2012

Zunächst ist zu beachten, dass nuget.config nicht alle Pfadeinstellungen im Nuget-Paketsystem steuert. Dies war besonders verwirrend herauszufinden. Insbesondere besteht das Problem darin, dass msbuild und Visual Studio (Aufruf von msbuild) den Pfad in nuget.config nicht verwenden, sondern ihn in der Datei nuget.targets überschreiben.

Umweltvorbereitung

Zuerst würde ich den Ordner Ihrer Lösung durchsuchen und alle vorhandenen \ packages \ -Ordner entfernen. Auf diese Weise stellen Sie sicher, dass alle Pakete sichtbar im richtigen Ordner installiert werden, und ermitteln fehlerhafte Pfadreferenzen in Ihren Lösungen. Als Nächstes würde ich sicherstellen, dass Sie die neueste Nuget Visual Studio-Erweiterung installiert haben. Ich würde auch sicherstellen, dass Sie die neueste nuget.exe in jeder Lösung installiert haben. Öffnen Sie eine Eingabeaufforderung, gehen Sie in jeden Ordner $ (SolutionDir) \ .nuget \ und führen Sie den folgenden Befehl aus:

nuget update -self

Festlegen des allgemeinen Paketordnerpfads für NuGet

Öffnen Sie jedes $ (SolutionDir) \ .nuget \ NuGet.Config und fügen Sie im Abschnitt <Konfiguration> Folgendes hinzu:

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

Hinweis: Sie können einen absoluten Pfad oder einen relativen Pfad verwenden. Denken Sie daran, wenn Sie einen relativen Pfad mit $ verwenden, der relativ zu einer Ebene unterhalb der Position von NuGet.Config ist (glauben Sie, dass dies ein Fehler ist).

Festlegen des allgemeinen Paketordnerpfads für MSBuild und Visual Studio

Öffnen Sie jedes $ (SolutionDir) \ .nuget \ NuGet.targets und ändern Sie den folgenden Abschnitt (beachten Sie, dass sich für Nicht-Windows ein weiterer Abschnitt darunter befindet):

<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
    <!-- Windows specific commands -->
    <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
    <PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
    <PackagesDir>$([System.IO.Path]::Combine($(SolutionDir), "packages"))</PackagesDir>
</PropertyGroup>

Aktualisieren Sie PackagesDir auf

<PackagesDir>$([System.IO.Path]::GetFullPath("$(SolutionDir)\..\Packages"))</PackagesDir>

Hinweis: Der GetFullPath löst unseren relativen Pfad in einen absoluten Pfad auf.

Wiederherstellen aller Nuget-Pakete in einem gemeinsamen Ordner

Öffnen Sie eine Eingabeaufforderung, gehen Sie zu jedem $ (SolutionDir) \ .nuget und führen Sie den folgenden Befehl aus:

nuget restore ..\YourSolution.sln

Zu diesem Zeitpunkt sollten Sie einen einzelnen Ordner \ packages \ an Ihrem gemeinsamen Speicherort und keinen in einem Ihrer Lösungsordner haben. Wenn nicht, überprüfen Sie Ihre Pfade.

Projektreferenzen korrigieren

Öffnen Sie jede .csproj-Datei in einem Texteditor, suchen Sie nach Verweisen auf \ packages und aktualisieren Sie sie auf den richtigen Pfad. Die meisten davon sind <HintPath> -Referenzen, aber nicht alle. Beispielsweise verfügen WebGrease und Microsoft.Bcl.Build über separate Pfadeinstellungen, die aktualisiert werden müssen.

Erstellen Sie Ihre Lösung

Öffnen Sie Ihre Lösung in Visual Studio und starten Sie einen Build. Wenn es sich über fehlende Pakete beschwert, die wiederhergestellt werden müssen, gehen Sie nicht davon aus, dass das Paket fehlt und wiederhergestellt werden muss (Fehler können irreführend sein). Es könnte ein schlechter Pfad in einer Ihrer .csproj-Dateien sein. Überprüfen Sie dies zuerst, bevor Sie das Paket wiederherstellen.

Haben Sie einen Build-Fehler bezüglich fehlender Pakete?

Wenn Sie bereits überprüft haben, ob die Pfade in Ihren .csproj-Dateien korrekt sind, haben Sie zwei Möglichkeiten. Wenn dies das Ergebnis der Aktualisierung Ihres Codes aus der Quellcodeverwaltung ist, können Sie versuchen, eine saubere Kopie auszuchecken und diese dann zu erstellen. Dies funktionierte für einen unserer Entwickler und ich denke, es gab ein Artefakt in der .suo-Datei oder etwas Ähnliches. Die andere Option besteht darin, eine Paketwiederherstellung manuell über die Befehlszeile im Ordner .nuget der betreffenden Lösung zu erzwingen:

nuget restore ..\YourSolution.sln
Vermis
quelle
Vielen Dank für die lange Antwort auf mein langes Problem. Ich werde diese Lösung ausprobieren und mich bei Ihnen melden.
Mats Isaksson
Würde es funktionieren, wenn sich beide .sln im selben Verzeichnis befinden? Würden sie am Ende dasselbe Paketverzeichnis teilen?
Tofutim
7
Ich denke, diese Antwort zeigt, wie starr Nuget ist. Die Notwendigkeit, eine so komplexe, starre Struktur zu erstellen, um ein so einfaches Konzept zu ermöglichen: - "die gleichen Baugruppen zwischen Lösungen zu teilen" ist ein Hinweis auf das schlechte Design des Ganzen.
Mick
1
Was funktioniert auch, um die HintPaths zu reparieren? Nachdem Sie die NuGet.config nach Ihren Wünschen aktualisiert haben, führen Sie in der Package-Manager-Konsole "Update-Package -reinstall" aus. Dadurch werden alle Pakete neu installiert und auch ihre Hinweispfade korrigiert. Danach - Sie könnten einige Relikte übrig haben (ich hatte in einigen Silverlight-Projekten - die "alten" Importe von Zielen / Builds waren noch da)
johannes.colmsee
1
@Vermis Wenn ich einen gemeinsamen Nuget-Paketordner für alle meine Lösungen einrichte. Welche Auswirkungen hat dies auf meinen Azure Devops-Build?
Pankaj Devrani
39

Anstatt für alle Projekte einen gemeinsamen Paketspeicherort festzulegen, können Sie HintPath im Projekt auch wie folgt ändern:

<HintPath>$(SolutionDir)\packages\EntityFramework.6.1.0\lib\net40\EntityFramework.dll</HintPath>

In den meisten Fällen gibt es in gemeinsam genutzten Projekten nur wenige Pakete, sodass Sie diese problemlos ändern können.

Ich denke, es ist eine bessere Lösung, wenn Sie Code verzweigen, wenn Sie ein gemeinsames Repo festlegen, müssen Sie den relativen Pfad ändern. In dieser Lösung müssen Sie dies nicht tun.

Adam Wyżgoł
quelle
2
Adam ist richtig. Dies ist die einfachste Lösung für ein unglaublich dummes Problem.
Lapsus
1
Es ist eine brillante Lösung. Einfach und klar, ohne dass die Struktur eines Codes neu erstellt werden muss.
RredCat
2
AFAIK $ (SolutionDir) wird nur festgelegt, wenn die Erstellung über VS erfolgt. Also kein Gebäude direkt über msbuild.exe, es sei denn, Sie setzen / p: SolutionDir = path
Lars Nielsen
Dies könnte automatisch hier eingestellt werden% APPDATA% \ Roaming \ NuGet \ NuGet.Config
Korayem
15
Dies funktioniert hervorragend, bis Sie das Paket aktualisieren und den HintPath mit einem neuen relativen Pfad überschreiben. Wird in einer großen Lösung mit vielen Paketen ziemlich langweilig. Gott bewahre, dass du ein Update-Paket ausführen musst
Neu
22

Meine Erfahrung mit der neuesten Version von NuGet (2.7) und VS2012:

  • Löschen Sie den Ordner .nuget (auf der Festplatte und in Lösung).
  • Legen Sie eine NuGet.Config-Datei in einem gemeinsamen übergeordneten Ordner aller Lösungen ab
  • Löschen Sie alle vorhandenen Paketordner
  • Durchsuchen Sie alle csproj-Dateien und ändern Sie HintPaths so, dass sie auf den neuen Speicherort verweisen
  • Profitieren

In meinem Fall wollte ich alle Pakete .packageseinfügen, daher sah meine NuGet.Config wie folgt aus.

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

Beachten Sie, dass einige "seltsame" Dinge passieren können, aber ich denke, sie sind erträglich:

  • Wenn Sie ein Paket von einer Lösung 'aktualisieren', wird die ältere Version sofort aus Ihrem Paketordner gelöscht (es kann nicht wissen, ob Sie eine andere Lösung haben, die darauf verweist). Das stört mich nicht sonderlich, da die andere Lösung nur bei Bedarf wiederhergestellt wird.
  • Wenn Sie versuchen, ein Paket aus einer Rechtsklick-Lösung hinzuzufügen, wenn das Paket bereits in einer anderen Lösung vorhanden ist, wird es dort angezeigt und das grüne Häkchen anstelle der Schaltfläche "Installieren" angezeigt. Normalerweise installiere ich über ein Projekt mit der rechten Maustaste, daher stört mich das überhaupt nicht.

Haftungsausschluss : Ich habe es heute gerade versucht, ich habe keine langjährige Erfahrung, um es zu sichern!

Benjol
quelle
4
Dies ist der empfohlene Weg, dies zu tun. Die alte msbuild-Integrationsmethode für die Nuget-Wiederherstellung in der akzeptierten Antwort ist eine Pita, und ich kann bestätigen, dass die NuGet.config neben der SLN-Funktion für uns mit der automatischen Paketwiederherstellung funktioniert. Das Ablegen in einem gemeinsamen übergeordneten Verzeichnis kann ich nicht bestätigen.
9swampy
1
Wie wird NuGet.Config für alle Lösungen (in TFS) in einem gemeinsamen übergeordneten Ordner abgelegt, damit sie darauf verweisen können? Ich kenne nur den Ordner .nuget unter jeder Lösung mit der Datei nuget.config. und wenn "repositorypath value = .packages", wird ein Unterordner unter dem .nuget wie folgt erstellt: C: \ TFS \ Comp \ Ent \ SolABC \ .nuget \ .packages - dies löst die verschachtelten Projekte / Lösungen nicht auf saubere Weise Das sollte auch beim automatisierten TFS-Build funktionieren. Die akzeptierte Antwort erfordert einige handcodierte Arbeiten sowie "Repositorypath value = $ \ .. \ .. \ .. \ Packages. Dies funktioniert nicht, wenn verschachtelte Projekte mit unterschiedlichen relativen Pfaden vorhanden sind.
hB0
2
Arbeitet mit Visual Studio 2015 und Nuget 3.4.3
Hüseyin Yağlı
Das ältere Paket wird nicht nur sofort gelöscht, sondern auch der von Ihnen in die csproj-Datei handcodierte HintPath überschrieben und beschädigt. @ hB0 ist korrekt. Dies funktioniert nur bei relativ einfachen Lösungen. Sobald Sie in eine komplexe TFS-Arbeitsbereichsstruktur mit Zweigen, gemeinsam genutzten Projekten usw. geraten, kann diese nicht mehr effizient skaliert werden.
gravidThoughts
20

Ich habe NuGet Version 2.8.50926 mit VS 2013. Sie müssen nicht mehrere nuget.config-Dateien oder komplexe Verzeichnisstrukturen verwenden. Ändern Sie einfach die Standarddatei hier:

%APPDATA%\Roaming\NuGet\NuGet.Config

Hier ist der Inhalt meiner Datei:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositoryPath" value="C:\Projects\nugetpackages" />
  </config>
  <activePackageSource>
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </activePackageSource>
</configuration>

Alle Pakete werden also im Ordner "C: \ Projects \ nugetpackages" abgelegt, unabhängig davon, wo sich die Lösung befindet.

Löschen Sie in all Ihren Lösungen einfach vorhandene "Paket" -Ordner. Erstellen Sie dann Ihre Lösung, und NuGet stellt die fehlenden Pakete automatisch in dem von Ihnen angegebenen neuen, zentralisierten Verzeichnis wieder her.

Matthieu
quelle
Dies ist bei weitem die einfachste Lösung von allen und verdient mehr Liebe!
Korayem
2
Dies ist heute zwar die einfachste Lösung, aber eines fehlt in Ihrer Antwort. Sie müssen sich weiterhin mit HintPath in den csproj-Dateien jedes Projekts befassen. Sie werden nicht automatisch auf einen neuen Pfad ausgerichtet. hab ich recht?
Batmaci
In einigen meiner alten Projekte wird manchmal auf den Ordner "alte" Pakete verwiesen. Für mich funktioniert jedoch alles korrekt, daher hat die globale Einstellung vermutlich Vorrang.
Matthieu
Informationen zu OSX finden Sie unter docs.microsoft.com/en-us/nuget/consume-packages/… . Ich mag auch die Idee von mklink unten.
Sgtz
3

Ab Visual Studio 2013 Update 4 und Nugget Package Manager Version> 2.8.5 ...

Erstellen Sie die Datei nuget.config im Stammverzeichnis des Repositorys.

Dateiinhalt:

<configuration>
  <config>
    <add key="repositoryPath" value="packages" />
  </config>
  <packageSources>
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </packageSources>
</configuration>

Dies führt dazu, dass alle Pakete in den Paketordner auf der Ebene Ihrer Datei nuget.config verschoben werden.

Jetzt können Sie für jede .sln-Nuget-Konsole mit dem Befehl 'update-package -reinstall' gehen.

Wenn Sie mehrere Repositorys auf derselben Ebene haben und denselben Paketordner gemeinsam nutzen möchten, versuchen Sie, einen Ordner nach oben zu verschieben.

 <add key="repositoryPath" value="..\packages" />

Auf diese Weise verursachen Sie jedoch, dass die Nuget-Paketreferenz csproj einen Ordner außerhalb Ihres Repositorys-Pfads nach oben zeigt.

Janusz Nowak
quelle
3

Ich habe ein NuGet-Paket zusammengestellt, das alle NuGet-Referenzen in einem Projekt transparent in ein $ (SolutionDir) -relatives Format konvertiert. Dies geschieht mithilfe der XSLT-Transformation zur Build-Zeit, sodass Sie Ihre Projektdatei nicht manuell hacken müssen. Sie können Ihre Pakete frei aktualisieren, es wird nichts kaputt gehen.

https://www.nuget.org/packages/NugetRelativeRefs

Wenn Sie Visual Studio 2015 Update 3 verwenden, können Sie Ihre Paketreferenzen einfach project.jsonwie hier beschrieben in ein Formular migrieren : https://oren.codes/2016/02/08/project-json-all-the-things

Oleg Tarasov
quelle
Leider sieht es so aus, als würde sich Microsoft von project.json entfernen . Ich mag auch dein Nuget-Paket. Vor einiger Zeit habe ich NuGetReferenceHintPathRewrite verwendet, das so ziemlich dasselbe macht, aber auf andere Weise
Andrey Borisko
2

Aktualisierung meiner Erfahrungen mit Nuget 2.8.3. Es war relativ einfach. Alles, was getan wurde, war die Paketwiederherstellung über die Rechtsklick-Lösung. 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. Ich habe das gleiche für alle meine anderen Projekte getan, bei denen nur inkrementelle Pakete heruntergeladen und auf vorhandene Pakete verwiesen wurde. Daher ein gemeinsames Paket-Repository für alle Projekte, wie festgelegt.

Hier finden Sie eine schrittweise Anleitung zum Aktivieren der Paketwiederherstellung.

http://blogs.4ward.it/enable-nuget-package-restore-in-visual-studio-and-tfs-2012-rc-to-building-windows-8-metro-apps/

Amarnath Chatterjee
quelle
2

Einfach Hardlink / Pakete zum gewünschten gemeinsamen Ort. Dann wird Ihr Projekt nicht für andere Benutzer beschädigt, die keinen speziellen Paketspeicherort haben.

Öffnen Sie eine Eingabeaufforderung als Administrator und verwenden Sie

mklink /prefix link_path Target_file/folder_path
user803469
quelle
2

Für jede signifikante Lösung werden die obigen Antworten zu kurz kommen. Ganz einfach, eine komplexe TFS-Arbeitsbereichsstruktur mit unterschiedlichen relativen Pfaden, Verzweigungen, gemeinsam genutzten Projekten usw. macht ein einzelnes zentrales Repository unmöglich.

Die Verwendung von ($ SolutionDir) ist ein Schritt in die richtige Richtung, aber das manuelle Codieren der csproj-Datei mit ($ SolutionDir) würde in einer Codebasis mit Hunderten von Paketen, die regelmäßig aktualisiert werden, ziemlich mühsam werden (jedes Mal, wenn eine Aktualisierung erfolgt, wird der HintPath überschrieben ein neuer relativer Pfad). Was passiert, wenn Sie Update-Package -Reinstall ausführen müssen?

Es gibt eine großartige Lösung namens NugetReferenceHintPathRewrite . Es automatisiert die Injektion von ($ SolutionDir) in die HintPaths unmittelbar vor dem Erstellen (ohne die csproj-Datei tatsächlich zu ändern). Ich stelle mir vor, es könnte leicht in automatisierte Build-Systeme integriert werden

gravidThoughts
quelle
1

Eine kurze Zusammenfassung für VS 2013 Professional mit NuGet Version: 2.8.60318.667

So würden Sie Pakete an einen Pfad relativ zum Ordner .nuget weiterleiten:

<configuration>
  <config>
    <add key="repositoryPath" value="../Dependencies" />
  </config>
</configuration>

Befindet sich Ihre Lösung (SLN-Datei) beispielsweise in C: \ Projects \ MySolution, wird beim Aktivieren der NuGet-Paketwiederherstellung der Ordner .nuget wie folgt erstellt: C: \ Projects \ MySolution.nuget, und die Pakete werden heruntergeladen in ein Verzeichnis wie das folgende: C: \ Projects \ MySolution \ Dependencies

HINWEIS: Aus irgendeinem (unbekannten) Grund muss ich jedes Mal, wenn ich den "repositoryPath" aktualisiere, die Lösung schließen und erneut öffnen, damit die Änderungen wirksam werden

Sudhanshu Mishra
quelle
Beachten Sie, dass auf dem schließenden Konfigurations-Tag ein Schrägstrich fehlt.
Moo
0

Für diejenigen, die paket als Paketmanager verwenden, gibt es eine Auto-Symlink-Option für Ihre Abhängigkeitsdatei:

storage: symlink

Übrigens: Paket nutzt Nuget

Referenz: https://fsprojects.github.io/Paket/dependencies-file.html

Wenn Sie so wenig wie möglich ändern möchten, können Sie Unterverzeichnisse regelmäßig mit einem Skript bereinigen. dh. Das Standardverhalten von Nuget besteht darin, Dateien von einem globalen Speicherort in einen lokalen Paketordner zu kopieren. Löschen Sie diese Dateien anschließend.

sgtz
quelle
0

Ich verwende nur NTFS-Junctions, um alle Paketordner direkt in einen einzelnen Ordner über den Repository-Wurzeln zu verschieben. Funktioniert super. Keine Probleme mit der parallelen Paketwiederherstellung über mehrere Lösungen hinweg. Ein Vorteil davon ist, dass Sie in Ihrem Quellcode überhaupt nichts neu konfigurieren müssen, wie z. B. die Hunderte von relativen Hinweispfaden in Ihren .csproj-Dateien. Es funktioniert einfach, indem das Dateisystem die Umleitung und Simulation eines einzelnen Paketordners übernimmt.

Achten Sie einfach auf "Git" -Probleme. Obwohl 'git status' über die Befehlszeile keine nicht bereitgestellten Änderungen anzeigt, habe ich festgestellt, dass GitKraken die 'package'-Junction als nicht bereitgestellte Datei ansieht . Es zeigt sogar Fehler wie "Datei ist ein Verzeichnis", wenn Sie darauf klicken. GitKraken wird auch versuchen, diese 'Datei' zu speichern, wenn Sie die Junction neu erstellen, die Junction zerstören und sie als tatsächliche Datei wiederherstellen, die Text mit dem ursprünglichen Dateipfad enthält. Sehr seltsames Verhalten. Vielleicht in der Lage sein , um es zu arbeiten , indem sie Pakete zu gewährleisten Datei zu Ihren .gitignore hinzugefügt wird .

Triynko
quelle
-1

Dies sind die Anweisungen ab NuGet 2.1: http://docs.nuget.org/docs/release-notes/nuget-2.1

Dateien auf Lösungsebene müssen nicht bearbeitet werden.

Funktioniert mit Visual Studio 2013 und drei Lösungsfreigabeprojekten.

Vergessen Sie nicht, NuGet auf Lösungsebene zu aktualisieren (jede nuget.exe in .nuget-Ordnern).

user3285954
quelle