Ich füge meinem ASP.NET-Projekt häufig viele Inhaltsdateien (hauptsächlich Bilder und JS) hinzu. Ich verwende das VS-Veröffentlichungssystem. Beim Veröffentlichen werden neue Dateien erst veröffentlicht, wenn ich sie in das Projekt aufgenommen habe. Ich möchte alle Dateien automatisch in das angegebene Verzeichnis aufnehmen. Gibt es eine Möglichkeit anzugeben, welche Verzeichnisse automatisch in die csproj-Datei oder irgendwo anders aufgenommen werden sollen?
85
Antworten:
Alter Thread, ich weiß, aber ich habe einen Weg gefunden, dies zu tun, den ich immer wieder vergesse, und auf meiner Suche, ihn ein letztes Mal zu finden, bin ich auf diese Frage gestoßen. Der beste Weg, den ich gefunden habe, ist die Verwendung des BeforeBuild-Ziels in der .csproj-Datei.
VS 2010 berührt diesen Abschnitt nicht und stellt sicher, dass Ihre Dateien bei jeder Erstellung des Projekts als Inhalt enthalten sind.
quelle
**\*.less
?**\*.less
bedeutet, dass alle * .less-Dateien in allen Verzeichnissen enthalten sind. In MSBUILD bedeutet ** "alle Verzeichnisse rekursiv"Sie können einfach die .csproj-Datei Ihrer Website erweitern. Fügen Sie einfach Ihren Inhaltsstammordner mit einem rekursiven Platzhalter hinzu:
Dadurch werden dieser Ordner und alle darunter liegenden Inhalte in Ihrem Lösungsbrowser sichtbar.
Wenn Sie versuchen, den Ordner im Lösungsbrowser durch Angabe auszublenden
es wird nicht veröffentlicht.
Aktualisieren
Wie Sie bereits festgestellt haben, wird der Platzhalter ersetzt, sobald Sie den Ordner in Ihrer Lösung berühren, da VS-Projekte nicht für beliebigen Inhalt ausgelegt sind.
Sie müssen also sicherstellen, dass der Ordner und sein Inhalt niemals innerhalb von VS geändert werden. Das Hinzufügen oder Entfernen von Dateien kann nur im Dateisystem erfolgen. Genau das wollten Sie, da ich Ihre Frage verstanden habe.
Es wäre einfacher, wenn der Ordner in VS ausgeblendet werden könnte, aber ich konnte keinen Weg finden, ihn auszublenden UND zu veröffentlichen.
Ein anderer erfolgloser Ansatz bestand darin, den Ordner durch eine
CreateItem
Aufgabe einzuschließen. Dies führte dazu, dass der Inhalt des Ordners in \ bin \ app.publish \ ... veröffentlicht wurde und nicht davon überzeugt werden konnte, ihn zusammen mit den Inhaltselementen in der .csproj zu veröffentlichen, sodass ich ihn in meiner Antwort nicht präsentierte.quelle
<Content Include="Images\**\*.*" />
es funktioniert. Sobald Sie weitere Bilder hinzugefügt haben, wird die .csproj-Datei geändert und alle Dateien in den Bildern / ... wieder aufgelistet. <Content Include = "Images * *. " /> Ist nicht mehr vorhanden .Für diejenigen, die Probleme mit der Antwort von Chris haben , ist dies die Lösung für Visual Studio 2012 und höher:
Wie Chris in seiner Antwort erwähnt hat, wird Visual Studio diesen Abschnitt nicht berühren
<Target>
, selbst wenn Sie manuell mit dem Zielverzeichnis herumspielen (Hinzufügen / Entfernen von Dateien).Bitte beachten Sie, dass Sie sollten ein Unterverzeichnis enthalten , in dem sich die Dateien befinden (im Fall oben, es ist
images
). Visual Studio / MSBuild platziert diese Dateien in demselben Verzeichnis innerhalb der Projektstruktur. Wenn Sie kein Unterverzeichnis verwenden, werden die Dateien im Stammverzeichnis der Projektstruktur abgelegt.Für eine kurze Erklärung der Platzhalter:
**
bedeutet alles rekursiv (Dateien, Unterverzeichnisse und Dateien innerhalb dieser)*.ext
Enthält alle Dateien mit der Erweiterungext
im Verzeichnis der obersten Ebene, jedoch keine Unterverzeichnisse*.ext
könnte sein*.png
,*.js
usw. Jede wird Dateierweiterung arbeiten**\*.ext
Enthält alle Dateien mit der Erweiterungext
aus dem Verzeichnis der obersten Ebene und alle Unterverzeichnisse.Beachten Sie zum Abschluss, dass es einen Unterschied zwischen der Verwendung
<Target>
und der Nichtverwendung gibt.Mit dem
<Target>
Ansatz, Visual Studio wird nicht zeigen , die Dateien innerhalb des Solution Explorer.Der nicht
<Target>
Ansatz wird Visual Studio anweisen, zeigt die Dateien innerhalb des Solution Explorer. Der Nachteil bei diesem ist, dass jede Manipulation der automatischen Verzeichnisse dazu führt, dass Visual Studio den Platzhaltereintrag überschreibt. Es sollte auch beachtet werden , dass der Ansatz unten wird nur die Lösung Explorer aktualisieren , auf die Lösung / Projekt in VS. Öffnung Selbst die Symbolleistenschaltfläche "Aktualisieren" des Projektmappen-Explorers reicht nicht aus.quelle
BeforeBuild
Veranstaltung durchgeführt? MSBuild muss zuerst das Projekt und die Binärdateien erstellen, bevor überhaupt eine Veröffentlichung in Betracht gezogen werden kann... AfterTargets="BeforeBuild"
. Das heißt, Ihr benutzerdefiniertes Ziel muss nach BeforeBuild ausgeführt werden, es wird jedoch nicht angegeben, wie viel danach. Mein Fehler ist jedoch, dass der aktuelle Zielbestellungsalgorithmus in Ordnung sein sollte: msdn.microsoft.com/en-us/library/ee216359.aspxSie können die
System.IO.Directory.GetFile(string)
Methode des Frameworks und seine Überladungen verwenden, um alle Dateien rekursiv einzuschließen.quelle
Include="**\*.ext"
bei Platzhaltern.Ich habe geschrieben, wie ich die Inhalts-Includes mit einem kleinen Powershell-Skript erstellen konnte:
Dies sollte die erforderliche include-Anweisung an der Powershell-Eingabeaufforderung erzeugen
quelle
Sie können Dateien mit solchen Links hinzufügen. Sie können durchsucht und angezeigt werden. Sie werden jedoch nicht ausgecheckt, wenn Sie versuchen, sie zu ändern. Außerdem lässt Visual Studio die Platzhalter an Ort und Stelle:
Dies geht in die .proj-Datei.
quelle
Meines Wissens nicht; Mein Vorschlag ist jedoch, sie in das Projekt einzufügen, da sie standardmäßig enthalten sind. Verwenden Sie Visual Studio, um die Dateien in die Ordner einzufügen, anstatt sie über den Explorer in das Verzeichnis einzufügen.
quelle
Ich erkannte, dass die beste Lösung dafür darin besteht, Dateien einzeln manuell hinzuzufügen. Wenn Sie Hunderte von ihnen haben, wie ich, war es nur eine Frage von wenigen Stunden. Komisch, dass dieses ernste Problem auch 2016 mit VS 2015 noch nicht gelöst ist. Ahh, wie ich Xcode liebe.
quelle