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.
quelle
$
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).Antworten:
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).
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:
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:
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:
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:
Festlegen des allgemeinen Paketordnerpfads für NuGet
Öffnen Sie jedes $ (SolutionDir) \ .nuget \ NuGet.Config und fügen Sie im Abschnitt <Konfiguration> Folgendes hinzu:
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):
Aktualisieren Sie PackagesDir auf
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:
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:
quelle
Anstatt für alle Projekte einen gemeinsamen Paketspeicherort festzulegen, können Sie HintPath im Projekt auch wie folgt ändern:
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.
quelle
Meine Erfahrung mit der neuesten Version von NuGet (2.7) und VS2012:
In meinem Fall wollte ich alle Pakete
.packages
einfügen, daher sah meine NuGet.Config wie folgt aus.Beachten Sie, dass einige "seltsame" Dinge passieren können, aber ich denke, sie sind erträglich:
Haftungsausschluss : Ich habe es heute gerade versucht, ich habe keine langjährige Erfahrung, um es zu sichern!
quelle
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:
Hier ist der Inhalt meiner Datei:
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.
quelle
Es ist bereits nicht erforderlich, nuget.targets zu ändern. Es wurde in Nuget 2.8 ( http://nuget.codeplex.com/workitem/2921 ) behoben . Sie müssen nur den Repository-Pfad festlegen.
quelle
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:
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.
Auf diese Weise verursachen Sie jedoch, dass die Nuget-Paketreferenz csproj einen Ordner außerhalb Ihres Repositorys-Pfads nach oben zeigt.
quelle
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.json
wie hier beschrieben in ein Formular migrieren : https://oren.codes/2016/02/08/project-json-all-the-thingsquelle
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:
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/
quelle
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
quelle
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
quelle
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:
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
quelle
Für diejenigen, die paket als Paketmanager verwenden, gibt es eine Auto-Symlink-Option für Ihre Abhängigkeitsdatei:
Ü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.
quelle
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 .
quelle
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).
quelle