Ich verwende npm zum Verwalten der jQuery-, Bootstrap-, Font Awesome- und ähnlichen Client-Bibliotheken, die ich für meine ASP.NET Core-Anwendung benötige.
Der Ansatz, der für mich funktioniert hat, begann mit dem Hinzufügen einer package.json-Datei zum Projekt, die folgendermaßen aussieht:
{
"version": "1.0.0",
"name": "myapp",
"private": true,
"devDependencies": {
},
"dependencies": {
"bootstrap": "^3.3.6",
"font-awesome": "^4.6.1",
"jquery": "^2.2.3"
}
}
npm stellt diese Pakete im Ordner node_modules wieder her, der sich auf derselben Ebene wie wwwroot im Projektverzeichnis befindet:
Da ASP.NET Core die statischen Dateien aus dem Ordner wwwroot bereitstellt und node_modules nicht vorhanden ist, musste ich einige Änderungen vornehmen, damit dies funktioniert. Die erste: Hinzufügen von app.UseFileServer direkt vor app.UseStaticFiles in meinem Startup. CS-Datei:
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")),
RequestPath = new PathString("/node_modules"),
EnableDirectoryBrowsing = true
});
app.UseStaticFiles();
und die zweite, einschließlich node_modules in meinen PublishOptions in der Datei project.json:
"publishOptions": {
"include": [
"web.config",
"wwwroot",
"Views",
"node_modules"
]
},
Dies funktioniert in meiner Entwicklungsumgebung und auch, wenn ich es auf meiner Azure App Service-Instanz bereitstelle. Die statischen Dateien jquery, bootstrap und font-awesome werden gut bereitgestellt, aber ich bin mir bei dieser Implementierung nicht sicher.
Was ist der richtige Ansatz dafür?
Diese Lösung kam, nachdem viele Informationen aus verschiedenen Quellen gesammelt und einige ausprobiert wurden, die nicht funktionierten, und es scheint ein bisschen seltsam, diese Dateien von außerhalb von wwwroot bereitstellen zu müssen.
Jeder Rat wird sehr geschätzt.
quelle
Bundler and Minifier
- Geben Sie an, dass die Quelle außerhalb von wwwroot liegt, und wenn Sie sie erstellen, wird die JS in wwwroot integriert. Das ist der richtige Weg. Sie sollten keine Inhalte von node_modulesnode_modules
Ordner statisch zu bedienen . a) So ist das Ökosystem nicht ausgelegt. b) Es ist ein Sicherheitsrisiko. Eines Ihrer installierten Pakete kann vertrauliche Informationen verlieren. Der richtige Weg besteht darin, eine Gebäude-Pipeline (grunt / gulp / node / webpack) einzurichten, die Dateien in einemsrc
oder einemwhatever
Ordner veröffentlicht, der für die Bereitstellung statischer Front-End-Dateien vorgesehen istAntworten:
Durch die Veröffentlichung Ihres gesamten
node_modules
Ordners stellen Sie weit mehr Dateien bereit, als Sie tatsächlich in der Produktion benötigen.Verwenden Sie stattdessen einen Task Runner als Teil Ihres Erstellungsprozesses, um die benötigten Dateien zu packen und in Ihrem
wwwroot
Ordner bereitzustellen. Auf diese Weise können Sie auch Ihre Assets gleichzeitig konzentrieren und minimieren, anstatt jede einzelne Bibliothek einzeln bedienen zu müssen.Sie können die
FileServer
Konfiguration dann auch vollständig entfernen und sichUseStaticFiles
stattdessen darauf verlassen.Derzeit ist gulp der VS-Task-Runner der Wahl. Fügen Sie a
gulpfile.js
zum Stammverzeichnis Ihres Projekts hinzu und konfigurieren Sie es so, dass Ihre statischen Dateien beim Veröffentlichen verarbeitet werden.Sie können beispielsweise den folgenden
scripts
Abschnitt zu Ihrem hinzufügenproject.json
:Welches würde mit der folgenden Gulpfile funktionieren (die Standardeinstellung beim Gerüstbau mit
yo
):quelle
node_modules
denn genau das macht npm. Die Schluckaufgabe ist notwendig, um Dinge an den richtigen Ort zu bringen, dh dorthin, wo Sie sie tatsächlich brauchen. Ich denke, das Problem ist, dass Microsoft eine so schöne Integration mit Bower bereitgestellt hat, aber jetzt ist Bower tot (oder stirbt zumindest) und Microsoft hat keine alternativen Tools bereitgestellt.npm
für die Verwaltung clientseitiger Bibliotheken ist eine gute Wahl (im Gegensatz zu Bower oder NuGet). Sie denken in die richtige Richtung :)FileServer
,StaticFiles
sollte ausreichen, um statische Dateien (.js, Bilder usw.) bereitzustellen.wwwroot
inpublic
, da sonst die Ordnerstruktur in Azure Web Apps verwirrend ist (D:\Home\site\wwwroot\wwwroot
vsD:\Home\site\wwwroot\public
)node_modules
auf einen Webhosting-Server pushen ). Siehetools/deploy.js
als Beispiel.Besuchen Sie das ASP.NET Core Starter Kit auf GitHub (Haftungsausschluss: Ich bin der Autor)
quelle
Installieren Sie den Bundler und den Minifier in Visual Studio Extensions
Dann erstellen Sie eine
bundleconfig.json
und geben Folgendes ein:Der Bundler und Minifier (gulp-basiert) hat also Zugriff auf die Quelldateien (die aus Visual Studio und auch aus GIT ausgeschlossen werden sollten) und fügt sie wie angegeben in die WWW-Wurzel ein
Bei jedem Speichern wird dies nur als Nebeneffekt ausgeführt (Sie können jedoch festlegen, dass es manuell ausgeführt wird).
quelle
Ich gebe Ihnen zwei Antworten. npm in Kombination mit anderen Tools ist leistungsstark, erfordert jedoch einige Arbeit zum Einrichten. Wenn Sie nur einige Bibliotheken herunterladen möchten, können Sie stattdessen den Bibliotheksmanager verwenden (veröffentlicht in Visual Studio 15.8).
NPM (Fortgeschrittene)
Fügen Sie zuerst package.json im Stammverzeichnis Ihres Projekts hinzu. Fügen Sie den folgenden Inhalt hinzu:
Dadurch lädt NPM Bootstrap, JQuery und andere Bibliotheken, die in einem neuen asp.net-Kernprojekt verwendet werden, in einen Ordner mit dem Namen node_modules herunter. Der nächste Schritt besteht darin, die Dateien an einen geeigneten Ort zu kopieren. Dazu verwenden wir gulp, das ebenfalls von NPM heruntergeladen wurde. Fügen Sie dann im Stammverzeichnis Ihres Projekts eine neue Datei mit dem Namen gulpfile.js hinzu . Fügen Sie den folgenden Inhalt hinzu:
Diese Datei enthält einen JavaScript-Code, der ausgeführt wird, wenn das Projekt erstellt und bereinigt wird. Es werden alle erforderlichen Dateien nach lib2 kopiert ( nicht nach lib - Sie können dies leicht ändern ). Ich habe die gleiche Struktur wie in einem neuen Projekt verwendet, aber es ist einfach, Dateien an einen anderen Speicherort zu ändern. Wenn Sie die Dateien verschieben, stellen Sie sicher, dass Sie auch _Layout.cshtml aktualisieren . Beachten Sie, dass alle Dateien im lib2-Verzeichnis entfernt werden, wenn das Projekt bereinigt wird.
Wenn Sie mit der rechten Maustaste auf gulpfile.js klicken , können Sie Task Runner Explorer auswählen . Von hier aus können Sie gulp manuell ausführen, um Dateien zu kopieren oder zu bereinigen.
Gulp kann auch für andere Aufgaben wie das Minimieren von JavaScript- und CSS-Dateien nützlich sein:
https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1
Bibliotheksverwalter (einfach)
Klicken Sie mit der rechten Maustaste auf Ihr Projekt und wählen Sie Clientseitenbibliotheken verwalten . Die Datei libman.json ist jetzt geöffnet. In dieser Datei geben Sie an, welche Bibliothek und Dateien verwendet werden sollen und wo sie lokal gespeichert werden sollen. Wirklich einfach! Die folgende Datei kopiert die Standardbibliotheken, die beim Erstellen eines neuen ASP.NET Core 2.1-Projekts verwendet werden:
Wenn Sie die Dateien verschieben, stellen Sie sicher, dass Sie auch _Layout.cshtml aktualisieren .
quelle
gulpfile.js
ingulp.task('default', function (done) {
Folgendes ändern und dann als letzte Zeile in dieser Funktion Folgendes hinzufügen:done();
Andernfalls würde ich die Fehlermeldung erhaltenThe following tasks did not complete: Did you forget to signal async completion?
Anstatt zu versuchen, den Knotenmodulordner zu bedienen, können Sie auch Gulp verwenden, um das zu kopieren, was Sie für wwwroot benötigen.
https://docs.asp.net/en/latest/client-side/using-gulp.html
Dies könnte auch helfen
Visual Studio 2015 ASP.NET 5, Gulp-Task kopiert keine Dateien von node_modules
quelle
Es gibt viele "richtige" Ansätze. Sie müssen nur entscheiden, welcher Ihren Anforderungen am besten entspricht. Es scheint, als ob Sie falsch verstehen, wie man
node_modules
...Wenn Sie mit NuGet vertraut sind , sollten Sie sich npm als clientseitiges Gegenstück vorstellen. Wo das
node_modules
Verzeichnis wie dasbin
Verzeichnis für NuGet ist . Die Idee ist, dass dieses Verzeichnis nur ein üblicher Speicherort für Pakete ist. Meiner Meinung nach ist es besser,dependency
die benötigten Pakete so zu übernehmen, wie Sie es in der Liste getan habenpackage.json
. Verwenden Sie dann einen Task-Runner wieGulp
beispielsweise, um die benötigten Dateien an den gewünschtenwwwroot
Speicherort zu kopieren .Ich habe im Januar einen Blog-Beitrag darüber geschrieben, der Details zu npm , Gulp und eine ganze Reihe anderer Details enthält, die heute noch relevant sind. Außerdem hat jemand auf meine SO-Frage aufmerksam gemacht, die ich gestellt und letztendlich hier selbst beantwortet habe , was wahrscheinlich hilfreich ist.
Ich habe eine erstellt
Gist
, die dasgulpfile.js
als Beispiel zeigt.In Ihrem ist
Startup.cs
es immer noch wichtig, statische Dateien zu verwenden:Dadurch wird sichergestellt, dass Ihre Anwendung auf das zugreifen kann, was sie benötigt.
quelle
Ein viel einfacherer Ansatz ist die Verwendung des OdeToCode.UseNodeModules Nuget-Pakets. Ich habe es gerade mit .Net Core 3.0 getestet. Sie müssen das Paket lediglich zur Lösung hinzufügen und in der Configure-Methode der Startup-Klasse darauf verweisen:
Ich habe davon aus dem hervorragenden Kurs zum Erstellen einer Webanwendung mit ASP.NET Core, MVC, Entity Framework Core, Bootstrap und Angular Pluralsight von Shawn Wildermuth erfahren.
quelle
Shawn Wildermuth hat hier eine nette Anleitung: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower
Der Artikel verweist auf die Gulpfile auf GitHub, in der er die Strategie im Artikel implementiert hat. Sie können einfach den größten Teil des gulpfile-Inhalts kopieren und in Ihren einfügen. Fügen Sie jedoch die entsprechenden Pakete in package.json unter devDependencies hinzu: gulp gulp-uglify gulp-concat rimraf merge-stream
quelle
Ich habe in meinem Projekt einen besseren Weg gefunden, um JS-Pakete mit NPM Gulp / Grunt-Task-Läufern zu verwalten. Ich mag die Idee nicht, ein NPM mit einer anderen Ebene der Javascript-Bibliothek zu haben, um die "Automatisierung" zu handhaben, und meine wichtigste Anforderung ist, das npm-Update einfach auszuführen, ohne sich darüber Gedanken zu machen, ob ich Schluck-Sachen ausführen muss. wenn es alles erfolgreich kopiert hat und umgekehrt.
Der NPM-Weg:
Der Python-Weg:
quelle
Bitte entschuldigen Sie die Länge dieses Beitrags.
Dies ist ein Arbeitsbeispiel mit ASP.NET Core Version 2.5.
Bemerkenswert ist, dass die Datei project.json ( siehe hier ) zugunsten von .csproj veraltet ist . Ein Problem mit .csproj . Datei ist die große Menge an Funktionen und die Tatsache, dass es keinen zentralen Ort für die Dokumentation gibt ( siehe hier ).
In diesem Beispiel wird der ASP.NET-Kern in einem Docker Linux-Container (alpine 3.9) ausgeführt. Die Pfade werden dies widerspiegeln. Es wird auch gulp ^ 4.0 verwendet. Mit einigen Änderungen sollte es jedoch mit älteren Versionen von ASP.NET Core, Gulp, NodeJS und auch ohne Docker funktionieren.
Aber hier ist eine Antwort:
gulpfile.js sehen hier das eigentliche Arbeitsbeispiel
Fügen Sie ein Ziel in die .csproj- Datei ein. Beachten Sie, dass wir auch eine Überwachung hinzugefügt haben , die überwacht und ausgeschlossen werden soll, wenn wir den
dotnet run watch
Befehl nutzen.app.csprod
Wenn
dotnet run build
es jetzt ausgeführt wird, werden auch Knotenmodule installiert und erstellt.quelle