Wie können Sie Skripte für mehrere Projekte in einer Lösung freigeben?

75

Für den Fall, dass die Frage nicht klar war. Ich habe 3 MVC-Projekte in einer Lösung. Jedes Mal, wenn ich ein neues Projekt erstelle, wird der Ordner "Scripts" mit allen .js-Dateien hinzugefügt, die ich jemals benötigen werde. Ich möchte nicht, dass dies jedes Mal für jede Anwendung erstellt wird. Gibt es eine Möglichkeit, Skripte aus einem zentralen Ordner in der Lösung zu referenzieren, damit alle Anwendungen / Projekte einen gemeinsamen Skriptordner mit allen ihnen gemeinsamen Skripten gemeinsam nutzen können?

Bearbeiten: Bitte erläutern Sie die Vor- und Nachteile, wenn es welche gibt ... jetzt bin ich neugierig.

EKet
quelle
Dies funktioniert nicht für Ordner, aber Sie können eine Datei aus einem anderen Projekt verknüpfen. Klicken Sie mit der rechten Maustaste auf einen Ordner und fügen Sie ein vorhandenes Element hinzu, suchen Sie Ihre Datei in einem anderen Projekt, klicken Sie auf den Pfeil neben der Schaltfläche Hinzufügen und wählen Sie "Als Link hinzufügen". Die Datei ist erst bei der Bereitstellung physisch am richtigen Speicherort vorhanden. Dies funktioniert also nicht für statische Skriptdateien beim Debuggen in Visual Studio.
Nick VanderPyle

Antworten:

117

Folgendes würde ich empfehlen:

Klicken Sie mit der rechten Maustaste auf die Lösung und erstellen Sie einen neuen Lösungsordner mit dem Namen Common Javascript Files(oder wie auch immer Sie ihn aufrufen möchten).

Neuer Lösungsordner

Common Javascript Files Solution Folder

Klicken Sie mit der rechten Maustaste auf die Lösung, klicken Sie im Windows Explorer auf Ordner öffnen , oder navigieren Sie dort manuell zu anderen Versionen von Visual Studio :(

Ordner im Windows Explorer öffnen

Erstellen Sie im Lösungsverzeichnis ein Verzeichnis mit demselben Namen wie der Lösungsordner (Lösungsordner stimmen normalerweise nicht mit Verzeichnissen auf Quellcodeebene überein, dies dient jedoch der Vernunft).

Allgemeines Javascript-Dateiverzeichnis

Fügen Sie in diesem neuen Verzeichnis Dateien hinzu, die von Lösungen gemeinsam genutzt werden müssen.

Hinzufügen von Javascript-Dateien zum Verzeichnis

Klicken Sie in Visual Studio auf den Lösungsordner und wählen Sie Hinzufügen - Vorhandenes Element .

Visual Studio Add - Vorhandenes Itme

Navigieren Sie im Dialogfeld zur Dateiauswahl zu dem zuvor erstellten Verzeichnis, wählen Sie die dem Verzeichnis hinzugefügten Dateien aus und klicken Sie auf Hinzufügen .

Wählen Sie Dateien zum Hinzufügen aus

Lösungsordnerdateien

Klicken Sie in jedem Projekt, das eine freigegebene Datei benötigt, mit der rechten Maustaste auf das Projekt (oder das Verzeichnis innerhalb des Projekts) und klicken Sie auf Hinzufügen - Vorhandenes Element .

Projekt Vorhandenes Element hinzufügen

Navigieren Sie zum freigegebenen Verzeichnis, wählen Sie die Dateien aus, klicken Sie auf den Dropdown-Pfeil und dann auf Als Link hinzufügen .

Als Link hinzufügen

Jetzt sind die Dateien in den Projekten im Wesentlichen Verknüpfungen zu den Dateien im Lösungsordner. Sie werden jedoch als tatsächliche Dateien im Projekt behandelt (dies schließt CS- oder Visual Basic-Dateien ein. Sie werden als Dateien kompiliert, die tatsächlich im Projekt vorhanden sind).

Verknüpfte Dateien

PROS

  • Dateien werden zur Entwurfszeit wirklich projektübergreifend geteilt
  • Es können nur die für jedes Projekt benötigten Dateien hinzugefügt werden, es ist nicht alles oder nichts
  • Erfordert keine Konfiguration in IIS (virtuelles Verzeichnis usw.)
  • Wenn sich die Lösung in der TFS-Quellcodeverwaltung befindet, können Sie das Verzeichnis zur TFS-Quelle hinzufügen, und die freigegebenen Dateien werden quellgesteuert.
  • Wenn Sie eine Datei bearbeiten, indem Sie sie im Projekt auswählen, wird die eigentliche Datei bearbeitet.
  • Durch das Löschen einer verknüpften Datei wird die Datei nicht gelöscht.
  • Dies ist nicht auf JS-Dateien beschränkt. Verknüpfte Dateien können JEDE Datei sein, die Sie möglicherweise benötigen (Bilder, CSS, XML, CS, CSHTML usw.).

Nachteile

  • Jede Bereitstellung erhält eine eigene Datei.
  • Es gibt eine kleine Lernkurve, wenn man versteht, dass Lösungsordner keine Verzeichnisse sind, die in einem Lösungsverzeichnis vorhanden sind.
Erik Philips
quelle
38
Es ist auch nützlich zu beachten, dass verknüpfte Dateien während des Debuggens nicht zugänglich sind, es sei denn, der Projektdatei wird eine Aufgabe hinzugefügt, um die verknüpften Dateien wie hier beschrieben manuell zu kopieren .
Mac
1
Wenn ich das Projekt veröffentliche, werden die Dateien nicht in die von mir erstellte Ordnerstruktur kopiert. Irgendeine Idee, wie man das löst?
Fonsini
2
@Fonsini Legt die Eigenschaften der verknüpften Dateien korrekt fest.
Erik Philips
1
Das Problem besteht darin, dass beim Versuch, die JS-Dateien in HTML aufzunehmen, die Auflösung in den tatsächlichen Ordner und nicht in den verknüpften Ordner erfolgen soll. Das ist überhaupt nicht praktikabel.
MarzSocks
1
Es könnte Sie interessieren, dass diese Antwort (indirekt) hier auf Meta diskutiert wird .
Ilmari Karonen
24

Das Beste, imo, ist, ein eigenes CDN zu erstellen ... Erstellen Sie einfach eine andere Site in IIS und geben Sie ihr eine eigene Bindung, z. B. "http://cdn.somedomain.com".

Speichern Sie dann alle Ihre CSS / JS / Schriftarten / freigegebenen Bilder usw. auf der CDN-Site und verlinken Sie sie von Ihren anderen Sites aus.

Dies löst 2 Probleme,

  1. Alle Ihre Inhalte werden freigegeben, wenn dies erforderlich ist, und Sie müssen nur 1 Revision pro Datei verwalten.
  2. Die Browser Ihrer Benutzer können sie an einem einzigen Ort zwischenspeichern, anstatt Kopien Ihrer Inhalte für jede Site herunterzuladen, auf der sie verwendet werden.

Ich habe diese Antwort hinzugefügt, weil ich sehe, dass viele Leute beim Erstellen virtueller Verzeichnisse referenzieren. Während dies die Dateien tatsächlich gemeinsam nutzt, werden mehrere Download-Pfade für sie erstellt, was eine extreme Verschwendung von Bandbreite darstellt. Warum sollten Ihre Benutzer jquery.js (1 * Anzahl von Websites) herunterladen, wenn Sie ihnen erlauben können, es einmal auf (cdn.somedomain.com) herunterzuladen?

Auch wenn ich Bandbreitenverschwendung sage, spreche ich nicht nur über Serverbandbreite, sondern auch über mobile Benutzer in Datenplänen ... Als Beispiel habe ich die HR-Site unseres Unternehmens (Versicherung usw.) auf meinem Telefon auf der anderen Seite aufgerufen Tag und es verbrauchte 25 MB direkt aus dem Tor, lud JQuery und ein paar Sachen jeweils 5 Mal herunter ... Auf einem 2 GB pro Monat Datenplan, Websites, die das tun, nerven mich wirklich.

Ryan Mann
quelle
Ich dachte, ich würde das hinzufügen, um auf sie zu verlinken. Verwenden Sie die Syntax //cdn.somedomain.com. Wenn Sie beide http / https konfiguriert haben, wird standardmäßig der Einschluss verwendet. Wenn Sie über eine Entwicklungs-CDN und eine Produktions-CDN verfügen, können Sie die CDN-URL in appSettings, z. B. ProdCdnUrl und DevCdnUrl, speichern und dann mithilfe der bedingten Kompilierung die URL für die Build-Konfiguration des Projekts auswählen, z. B. #if DEV getdevurl #if PROD getprodurl .. Verwenden Sie es dann in Ihrer Rasiervorlage so etwas wie script src = "@ (cdnUrl) / lib / bootstrap ..."
Ryan Mann
1
Weitere Folgemaßnahmen dazu: Ich habe die Verwendung von Skript- und Stilpaketen mit dieser Methode vollständig beendet. Stattdessen verwende ich Node.js, Gulp, Css-Minify, Uglify, gulp-sass usw. Also mache ich einfach "Gulp compile-css" und "gulp compile-js" und "gulp watch-css" und "gulp watch-" js "im Knoten, um das Transpilieren meines Sass- und ES6-Javascript in CSS- und ES5-Javascript zu handhaben. Außerdem habe ich die Datei node project.json im Stammverzeichnis meiner .Net mvc-Webanwendung und verwende vs node-Tools für das interaktive Knotenfenster, um mit Knoten von VS zu arbeiten, sowie die Befehlszeilenerweiterung hier für VS.
Ryan Mann
Vielen Dank für die neuen Erkenntnisse in Ihrem Kommentar vom Februar 2016.
Theophilus
Ich habe mich wieder verändert. Ich verwende Gulp4 jetzt mit Babel und Rollup Js und habe Rollup so konfiguriert, dass es zu IIFE kompiliert wird. Und ich kompiliere Assets zu Nuget-Paketen. Auf unserem CDN haben wir ein grundlegendes .Net-Projekt-Setup über den Dotnet-Kern, in dem wir Pakete und aktualisierte Pakete hinzufügen und die Dotnet-Wiederherstellung verwenden können. Wenn wir also etwas zum CDN hinzufügen möchten, tun wir dies in einem Nuget-Paket und richten es so ein, dass es beim Erstellen transpiliert wird. "Dotnet Pack" erstellt ein Paket aus dem Ordner "dst" und fügt bei der Installation das dst hinzu Ordner zum Zielprojekt mit der gewünschten Erbschaft. So können wir die CDN mit Dotnet CLI steuern.
Ryan Mann
Wenn wir ein Paket aktualisieren, können wir außerdem einfach ein Dotnet-Aktualisierungsskript ausführen und dieses in Release Management / Devops-Automatisierung einrichten.
Ryan Mann
11

Hier ist es, IMO die beste und einfachste Lösung. Ich habe eine Woche lang versucht, den besten und einfachsten Weg zu finden, der immer mehr Nachteile als Vorteile hatte:

Resources(DLL)
  Shared
    images
      image.png
    css
      shared.css
    scripts
      jquery.js


MvcApp1
  Images
  Content
  Shared <- We want to get files from above dll here
  ...

MvcApp2
  Images
  Content
  Shared <- We want to get files from above dll here
  ...

Fügen Sie MvcApp1 -> Projekt -> MvcApp1-Eigenschaften -> Build-Ereignisse -> Post-Build-Ereignis Folgendes hinzu:

start xcopy "$(SolutionDir)Resources\Shared\*" "$(SolutionDir)MvcApp1\Shared" /r /s /i /y

Hier finden Sie eine Erläuterung der Funktionsweise: Einschließlich des Verzeichnisses der Inhaltsdateien zum Erstellen von Aktionen aus der Assembly, auf die verwiesen wird, auf derselben Ebene wie das Verzeichnis bin

Machen Sie dasselbe für MvcApp2. Jetzt werden nach jedem Build neue statische Dateien in Ihre App kopiert und Sie können auf Dateien wie "~ / Shared / css / site.css" zugreifen.

Wenn Sie möchten, können Sie den obigen Befehl anpassen, um Skripte von .dll in den Skriptordner jeder App zu kopieren. Auf diese Weise können Sie einige Skripte in .dll verschieben, ohne Pfade ändern zu müssen. Hier ein Beispiel:

Wenn Sie nach jedem Build nur Skripte aus Resources / Shared / scripts in MvcApp1 / scripts kopieren möchten:

start xcopy "$(SolutionDir)Resources\Shared\Scripts\*" "$(SolutionDir)MvcApp1\Scripts" /r /s /i /y
formatc
quelle
3 Fragen: 1) Was passiert, wenn eine Datei aus den Ressourcen / Freigegeben gelöscht wird - es sieht nicht so aus, als würde sie aus der MvcApp-Kopie des Ordners gelöscht? 2) Gibt es eine Möglichkeit, Visual Studio dazu zu bringen, diese Dateien $(SolutionDir)nach Abschluss der Ausführung zu löschen? Wenn Sie sie dort lassen, können andere Entwickler verwirrt werden. 3) Sie haben (DLL) in Klammern nach dem Ordner "Ressourcen". Gibt es eine spezielle Möglichkeit, dies einzurichten?
Adam
1) Sie würden natürlich im Ordner bleiben, da wir sie nur kopieren. 2) Die Lösung wäre, alle Dateien im Ordner vor dem Kopieren zu löschen. Sie würden vor xcopy so etwas hinzufügen: stackoverflow.com/questions/768282/… , oder schreiben Sie ein Batch-Skript, das Dateien in zwei Ordnern überprüft, Unterschiede löscht und wie folgt aufruft : stackoverflow.com/questions/12764847/… 3) Es dient nur zu Demonstrationszwecken und ist ein DLL-Projekt namens Resources
formatc
@ Adam siehe obigen Kommentar.
Formatc
Jedes Mal, wenn Sie eine freigegebene Ressource bearbeiten, müssen Sie das Projekt erstellen, um die Änderungen zu sehen, oder?
Crush
@crush Ja, aber Sie können ein Batch-Skript erstellen und diese Befehle einfügen, dann das Post-Build-Ereignis ersetzen, um Ihr Skript zu starten, und Sie können es manuell starten. Möglicherweise gibt es in VS ein "Makro" oder etwas, das Ihr Skript ausführen lässt bei Dateiänderung.
Format
6

Dies ist eine späte Antwort, aber Microsoft hat einen Projekttyp namens " Shared ProjectStart" hinzugefügt Visual Studio 2013 Update 2, der genau das kann, was Sie nicht wollen, ohne linkDateien zu benötigen .

Die Referenz für freigegebene Projekte wird im Projektmappen-Explorer unter dem Knoten Verweise angezeigt, aber der Code und die Assets im freigegebenen Projekt werden so behandelt, als wären sie Dateien, die mit dem Hauptprojekt verknüpft sind.

"In früheren Versionen von Visual Studio konnten Sie den Quellcode zwischen Projekten freigeben, indem Sie Hinzufügen -> Vorhandenes Element hinzufügen und dann Verknüpfung auswählen. Dies war jedoch etwas umständlich, und jede einzelne Quelldatei musste einzeln ausgewählt werden. Um mehrere zu unterstützen Auf unterschiedlichen Plattformen (iOS, Android usw.) haben sie beschlossen, die gemeinsame Nutzung von Quellen zwischen Projekten zu vereinfachen, indem sie das Konzept der gemeinsamen Projekte hinzugefügt haben. "

https://blogs.msdn.microsoft.com/somasegar/2014/04/02/visual-studio-2013-update-2-rc-windows-phone-8-1-tools-shared-projects-and-universal- Windows-Apps /

Infos von diesem Thread:

Was ist der Unterschied zwischen einem freigegebenen Projekt und einer Klassenbibliothek in Visual Studio 2015?

https://stackoverflow.com/a/30638495/3850405

Ogglas
quelle
Auf dem Papier klingt das großartig, aber ich habe noch kein Beispiel dafür gesehen, wie gemeinsam genutzte Projekte erfolgreich mit JavaScript-Dateien verwendet werden. Sie können das freigegebene Projekt sicher erstellen und Ihre Skripte dort ablegen, aber das Webprojekt scheint sie nicht richtig zu erkennen.
Nathanael
3

Ein Vorschlag, mit dem Sie Ihre Skripte debuggen können, ohne das Projekt neu zu kompilieren:

  • Wählen Sie ein " Master " -Projekt (das Sie zum Debuggen verwenden) und fügen Sie die physischen Dateien hinzu
  • Verwenden Sie die Funktion "Als Link hinzufügen", wie in Erics Antwort beschrieben, um die Skriptdateien zu den anderen in Lösung befindlichen Projekten hinzuzufügen
  • Verwenden Sie die Aufgabe "CopyLinkedContentFiles" beim Erstellen, wie im Kommentar von Mac vorgeschlagen, um die Dateien auf die Sekunde in Ihre zusätzlichen Projekte zu kopieren

Auf diese Weise können Sie die Skripte im " Master " -Projekt ändern, ohne den Debugger neu zu starten, was für mich den Unterschied ausmacht.

DivineOps
quelle
Können Sie erklären, wie es möglich ist, "Master" -Projektdateien zu ändern und die Änderungen verfügbar zu machen, während die App ausgeführt wird, ohne den Debugger neu zu starten? Verknüpfte Dateien werden nur beim Erstellen kopiert und Sie können nicht erstellen, ohne den Debugger zu stoppen.
Pbalaga
Wenn Sie dem "Master" physische Dateien hinzufügen (nicht nur die Links), können Sie den Master ändern, ohne ihn neu zu starten. In anderen Projekten werden die verknüpften Dateien beim Erstellen kopiert, dies hat jedoch eine geringere Auswirkung, da ich die meiste Zeit damit verbracht habe, den Master auszuführen.
DivineOps
Dies sollte als Antwort markiert werden, da es so weniger Ärger gibt! Die Änderung, die an der .csproj vorgenommen werden muss, lautet wie folgt: <! - Kopieren Sie verknüpfte Inhaltsdateien an ihren Speicherort beim Erstellen. -> <Target Name = "CopyLinkedContentFiles" BeforeTargets = "Build"> <Copy SourceFiles = "% (Content.Identity)" DestinationFiles = "% (Content.Link)" SkipUnchangedFiles = "true" OverwriteReadOnlyFiles = "true" Condition = "'% (Content.Link)'! = ''" /> </ Target>
barbara.post
2

Erstellen Sie in IIS einen virtuellen Ordner, der für jede der drei Anwendungen auf denselben Skriptordner verweist. Dann müssen Sie sie nur noch in einer einzigen Anwendung aufbewahren. Es gibt andere Alternativen, aber es hängt wirklich davon ab, wie Ihre Anwendungen strukturiert sind.

Bearbeiten

Eine beängstigendere Idee ist die Verwendung von Bereichen. In einem gemeinsamen Bereich haben Sie ein Skriptverzeichnis mit den zu kompilierenden Skripten. Dann servieren Sie sie selbst, indem Sie sie aus der DLL entfernen. Dies ist möglicherweise eine gute Idee, wenn Sie davon ausgehen, dass der Gemeinschaftsbereich später mehr Funktionen bietet.

Yuriy Faktorovich
quelle
Das ist eine großartige Idee, wenn sich das Projekt auf dem Server befindet. Was ist, wenn sich das Projekt noch in der Entwicklungsbox in Visual Studio befindet?
Nick VanderPyle
@ NickVanderPyle gleiche Idee würde funktionieren. Sollte in der Lage sein, es einzurichten, unabhängig davon, ob Sie Loopback-Adapter und verschiedene Sites oder nur verschiedene Anwendungen verwenden.
Yuriy Faktorovich
Oh, ich verstehe. Dies funktioniert, wenn Sie IIS lokal ausführen und debuggen und virtuelle Ordner verwenden können. Guter Anruf.
Nick VanderPyle
Was halten Sie von einem NTFS-Verbindungspunkt, wenn IIS nicht verfügbar ist?
Nick VanderPyle
@NickVanderPyle Sie müssten die Skriptverzeichnisse aus 2 der Projekte entfernen, aber ja, das klingt auch ziemlich gut.
Yuriy Faktorovich
1

Die meisten standardmäßig enthaltenen Dateien sind auch über verschiedene CDNs verfügbar.

Wenn Sie keine eigenen benutzerdefinierten Skripte hinzufügen, benötigen Sie möglicherweise nicht einmal ein Skriptverzeichnis.

Microsofts CDN für Skripte: http://www.asp.net/ajaxlibrary/cdn.ashx

jbrunken
quelle