NuGet-Paket-Dateien, die nicht kopiert wird, um die Projekt-Inhalte beim bauen
Baue ich eine MVC4 Webanwendung mit VS2012 professional mit NuGet-Paket-Manager version 2.2.31210. Ich habe mehrere Projekte in meiner Lösung, die alle teilen die verschiedenen Pakete, die ich installiert mit NuGet. Eines meiner Projekte ist eine MVC4-Anwendung, wo ich bin mit Paketen wie bootstrap, jquery UI, etc, alles installiert, mit NuGet.
Wenn ich Klonen einer frischen Kopie meiner kompletten Lösung aus meinem repository und build meine MVC4-Projekt, das Paket restore-Funktion scheint zu funktionieren: es wird das packages-Verzeichnis unter dem Projektmappen-Verzeichnis und füllt es werden alle Versionen der Pakete, die ich erwarten, zu sehen. Jedoch der Inhalt von Dateien nicht kopiert, an die entsprechenden stellen im MVC-app-Verzeichnis. Die seltsame Sache ist, dass es funktioniert erstellen Sie die Verzeichnisse für den Inhalt, aber nicht kopieren Sie den Inhalt der Dateien selbst.
So bin ich zum Beispiel über das Twitter Bootstrap Paket, in dem angezeigt wird, in der Pakete/Twitter.Bootstrap.2.2.2. Im MVC-Projekt einen Ordner namens bootstrap (mit css, img und js Verzeichnisse) angelegt wird, in das Inhalts-Verzeichnis. Aber, keine css-oder js-Dateien kopiert werden in diese Verzeichnisse!
Hat jemand eine Ahnung, was Magie Beschwörung muss ich aussprechen, um die build-zu-kopieren Sie diese Dateien von der NuGet-Pakete-Verzeichnis?
- dies scheint zu sein, verfolgt mit diesem bug nuget.codeplex.com/workitem/1239
- Dies scheint wie eine ziemlich große Fehler für mich. Ich Blick das NuGet-Package-Restore-Funktion als grundlegend gebrochen werden, wenn es kopiert keine Dateien in den gleichen Orten, die Sie kopiert werden, bei der erstmaligen installation eines Pakets.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe ein workaround, aber es ist hässlich. Durch ausführen der folgenden Befehl in der NuGet Package Manager Console:
Update-Package -Reinstall
alle Dateien werden tatsächlich kopiert und an die richtige Stelle innerhalb der Mvc-ProjektContent
undScripts
Verzeichnisse.Leider, dies ist riskant, weil Sie wahrscheinlich am Ende mit dem falschen Versionen bestimmter Pakete. Zum Beispiel, in meinem Fall, nachdem der Befehl abgeschlossen ist (das dauert eine ganze Weile, übrigens), dass ich am Ende mit jQuery version 1.4.4. Das ist so alt, und ich nehme an, es muss eine explizite Abhängigkeit von einige andere Pakete, die aktualisiert werden. So erscheint es, dass die Reihenfolge, in der die Pakete tatsächlich ein Update von NuGet ist signifikant (es wird nicht angezeigt, um eine Analyse der gesamten Abhängigkeitsbaum, die für alle Pakete und wählen nur die neuesten Versionen von der union mit allen Abhängigkeiten, die scheint, wie es wäre, das gewünschte Verhalten). Vielmehr, wie der Befehl ausgeführt wird, sehe ich es ersetzt das jQuery-Paket mehrfach mit unterschiedlichen Versionen, wie funktioniert es seinen Weg durch alle Pakete und deren Abhängigkeiten, nur um am Ende mit einer sehr alten version.
Einem ähnlichen Ansatz ist die Ausführung der
Update-Package -Reinstall
Befehl explizit für jedes Paket, das verursacht mein problem, aber das ist unglaublich mühsam und fehleranfällig.Den NuGet-Package-Restore-Funktion sollte, erzielen Sie dasselbe Ergebnis wie beim manuellen ausführen der
Install-Package
oderUpdate-Package -Reinstall
Befehl für ein Paket, muss es aber nicht.Update-Package -Reinstall -project YourProject -FileConflictAction OverwriteAll
Hoffe, das hilft.Dies ist ein sehr häufiges Problem, wir sind alle mit. Ich habe eine MSBuild-Aufgabe NugetContentRestoreTask, die diese trick für Sie. Führen Sie den folgenden Befehl in der Paket-Manager-Konsole:
Installieren Sie Nuget-Inhalte Wiederherstellen MSBuild -
Das einzige, was Links ist, rufen Sie es von Ihrem
BeforeBuild
Ziel mit so etwas wie dies:Projekt-Datei-Ziele
Können Sie einen Blick auf die Quelle repo und finden es auf nuget.org
Zusätzliche Content-Ordner
Diese nuget enthält nur die Standard-Ordner
scripts
,images
,fonts
, undcontent
ist es nicht eine rekursive Verzeichnis enthält. Für zusätzliche Inhalte, die Unterordner - weisen Sie der EigenschaftAdditionalFolders
.install.ps1
oderpackages.config
Verhalten mitPackageReference
.Install.ps1
scheint auch zu sein, nicht empfohlen, da es keine core-Unterstützung.Ich weiß nicht, wie die externe JavaScript-Dateien unter Quellcodeverwaltung entweder. Thats, warum ich verfolgt habe Jeff Handley Beratung in http://nuget.codeplex.com/workitem/2094 eine Lösung zu schaffen, meine Selbstachtung. Ich wollte nicht gehen die ausführbare Datei Weg, sondern schuf eine nuget-Lösung level-Paket, das funktioniert der trick.
http://www.nuget.org/packages/Baseclass.Contrib.Nuget.GitIgnoreContent/
Es ist gebunden an git, da es automatisch aktualisiert die .gitignore-Datei.
Kurze Beschreibung:
Ignorieren nuget-content-Dateien in git:
Erzeugen Einträge in die .gitignore-Datei, um auszuschließen nuget-content-Dateien aus dem Quell-repository
Wiederherstellen nuget-content-Dateien vor dem Gebäude (Automatisch VS. manuell mit einem powershell-Skript
Ich geschrieben habe, in einem blog-Beitrag beschreibt, wie es zu benutzen.
http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=9&mobile=0
In Visual Studio 2015 Update 1, Sie unterstützen nun contentFiles. Der Nachteil dabei ist, dass es funktioniert nur in Projekte, die auf dem Projekt.json.
In Bezug auf das problem, das Sie haben, gibt es einen guten blog-post, der erklärt, warum sehen Sie dieses Verhalten: NuGet-Package-Restore-Häufige Missverständnisse.
project.json
ist jetzt veraltet -PackageReference
ist nun die bevorzugte Methode zur VerwaltungcontentFiles