Gute Frage. Ich habe gerade einen sehr detaillierten Blogeintrag dazu im Web Deployment Tool (MSDeploy) veröffentlicht: Build Package mit zusätzlichen Dateien oder ohne bestimmte Dateien .
Hier ist die Zusammenfassung. Nachdem ich Dateien eingeschlossen habe, zeige ich, wie man auch Dateien ausschließt.
Einschließlich zusätzlicher Dateien
Das Einfügen zusätzlicher Dateien in das Paket ist etwas schwieriger, aber immer noch kein Problem, wenn Sie mit MSBuild vertraut sind und wenn Sie dies nicht tun, lesen Sie dies. Dazu müssen wir uns in den Teil des Prozesses einbinden, der die Dateien zum Verpacken sammelt. Das Ziel, das wir erweitern müssen, heißt CopyAllFilesToSingleFolder. Dieses Ziel verfügt über die Abhängigkeitseigenschaft PipelinePreDeployCopyAllFilesToOneFolderDependsOn, die wir abrufen und in unser eigenes Ziel einfügen können. Also werden wir ein Ziel namens CustomCollectFiles erstellen und dieses in den Prozess einfügen. Dies erreichen wir mit folgendem (denken Sie nach der Importanweisung daran).
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
Dadurch wird unser Ziel zum Prozess hinzugefügt. Jetzt müssen wir das Ziel selbst definieren. Angenommen, Sie haben einen Ordner mit dem Namen "Zusätzliche Dateien", der sich 1 Ebene über Ihrem Webprojekt befindet. Sie möchten alle diese Dateien einschließen. Hier ist das CustomCollectFiles-Ziel, das wir anschließend diskutieren.
<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />
<FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
Hier habe ich das Element _CustomFiles erstellt und im Include-Attribut angewiesen, alle Dateien in diesem Ordner und alle darunter liegenden Ordner aufzunehmen. Wenn von einer Chance müssen Sie ausschließen etwas aus dieser Liste, fügen Sie ein Exclude
Attribut zu _CustomFiles
.
Dann benutze ich dieses Element, um das FilesForPackagingFromProject-Element zu füllen. Dies ist das Element, mit dem MSDeploy tatsächlich zusätzliche Dateien hinzufügt. Beachten Sie auch, dass ich den Metadaten-Wert DestinationRelativePath deklariert habe. Dies bestimmt den relativen Pfad, den es in das Paket einfügen wird. Ich habe hier die Anweisung Extra Files% (RecursiveDir)% (Filename)% (Extension) verwendet. Das heißt, Sie platzieren es an derselben relativen Position im Paket wie im Ordner "Zusätzliche Dateien".
Dateien ausschließen
Wenn Sie die Projektdatei einer mit VS 2010 erstellten Webanwendung unten öffnen, finden Sie eine Zeile mit.
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Übrigens können Sie die Projektdatei in VS öffnen. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Projekt entladen. Klicken Sie dann mit der rechten Maustaste auf das entladene Projekt und wählen Sie Projekt bearbeiten.
Diese Erklärung enthält alle Ziele und Aufgaben, die wir benötigen. Die meisten unserer Anpassungen sollten nach diesem Import erfolgen, wenn Sie nicht sicher sind, ob nachher! Wenn Sie also Dateien ausschließen müssen, gibt es einen Elementnamen, ExcludeFromPackageFiles, der dazu verwendet werden kann. Angenommen, Sie haben eine Datei mit dem Namen Sample.Debug.xml in Ihrer Webanwendung, möchten jedoch, dass diese Datei aus den erstellten Paketen ausgeschlossen wird. Sie können das Snippet unten nach dieser Importanweisung platzieren.
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
Wenn Sie das Auffüllen dieses Elements deklarieren, werden die Dateien automatisch ausgeschlossen. Beachten Sie hier die Verwendung der FromTarget
Metadaten. Ich werde hier nicht darauf eingehen, aber Sie sollten wissen, dass Sie das immer spezifizieren müssen.
Eine einfachere Lösung besteht darin, die csproj-Datei so zu bearbeiten, dass die erforderliche DLL in den Ordner bin aufgenommen wird, und dann ein Ziel vor dem Erstellen zu erstellen, um das Element aus dem allgemeinen Bibliotheksordner, in dem wir unsere DLLs von Drittanbietern speichern, in den Ordner bin zu kopieren. Da das Element in der Lösungsdatei vorhanden ist, wird es von msbuild / msdeploy bereitgestellt und es ist nichts Kompliziertes erforderlich.
Tag, das zum Einschließen von Dateien ohne Hinzufügen über VS verwendet wird (das normalerweise zu Ihrem VCS hinzugefügt werden soll)
Dies ist das BeforeBuild-Ziel, das für mich funktioniert hat:
Bearbeitet, um den Vorschlag von @ tuespetre aufzunehmen, den Eintrag auszublenden, wodurch der vorherige Nachteil eines sichtbaren Bin-Ordners entfernt wird. Von mir nicht bestätigt.
quelle
<Visible>false</Visible>
es vor dem Projektmappen-Explorer ausgeblendet wird.Genau wie @toxaq, aber eine noch einfachere Lösung ist:
Fügen Sie im Lösungs-Explorer die Datei als Link zum Ordner "Bibliothek / Referenzen" hinzu und legen Sie sie in den Eigenschaften so fest, dass sie in die Ausgabe des Builds kopiert wird.
quelle
Die Implementierung von Sayed hat bei mir also nicht funktioniert. Ich verwende VS2013 und das Web Deploy-Paket und musste einige Plugin-DLLs aus einem anderen Ordner in den Bin des Deployment-Pakets einfügen. So habe ich es geschafft (viel einfacher):
Fügen Sie am Ende Ihrer csproj-Datei Folgendes hinzu:
Weitere Erwähnungen in der csproj-Datei:
quelle
Wollte einen Kommentar abgeben, um den obigen Kommentar von Emil Lerch hervorzuheben. Wenn Sie ein Azure SDK installiert haben, suchen Sie nach einer anderen DependencyProperty.
Grundsätzlich müssen Sie möglicherweise "CopyAllFilesToSingleFolderForMsdeployDependsOn" anstelle von "CopyAllFilesToSingleFolderForPackageDependsOn" verwenden. Ich bin kein fortgeschrittener MsBuild-Typ und habe Stunden damit verbracht, herauszufinden, warum meine Ziele nicht aufgerufen wurden.
Hier ist ein weiterer Link, wenn dies für Sie nicht funktioniert und Sie ein Azure SDK installiert haben: http://forums.iis.net/t/1190714.aspx
quelle
Als Ergänzung zu Sayeds Antwort stellte ich fest, dass eine statische Deklaration von ExcludeFromPackageFiles-Elementen in meinem Projekt nicht ausreichte. Ich musste bestimmte DLLs ausschließen, die erst nach dem Kompilieren verfügbar waren (Azure-spezifische Ninject-Module, die bei der Bereitstellung auf IIS nicht benötigt werden).
Also habe ich versucht, meine ExcludeFromPackageFiles-Liste mit dem oben angegebenen Trick CopyAllFilesToSingleFolderForPackageDependsOn zu generieren. Dies ist jedoch zu spät, da der Verpackungsprozess die ExcludeFromPackageFiles-Elemente bereits entfernt hat. Also habe ich die gleiche Technik angewendet, aber etwas früher:
Hoffe das hilft jemandem ...
quelle
Es ist auch möglich, die Datei als Inhalt | festzulegen Immer kopieren
quelle