Wie erhalte ich die Visual Studio-Veröffentlichungsfunktion, um Dateien aus dem Post-Build-Ereignis einzuschließen?

89

Ich versuche derzeit, die Visual Studio 2010-Funktionen "Veröffentlichen" und "MSDeploy" zu verwenden, um meine Anforderungen an die Webbereitstellung zu erfüllen, bin jedoch auf eine Straßensperre hinsichtlich der Anpassung des Pakets abhängig von meiner Build-Konfiguration gestoßen.

Ich entwickle in einer 32-Bit-Umgebung, muss jedoch ein Release-Paket für eine 64-Bit-Umgebung erstellen. Daher habe ich in der 'Release'-Konfiguration ein Post-Build-Ereignis, das die 64-Bit-Version einer DLL eines Drittanbieters in das bin-Verzeichnis kopiert und die 32-Bit-Version überschreibt . Wenn ich die Funktion "Veröffentlichen" verwende, wird die richtige 64-Bit-DLL, obwohl sie in das bin-Verzeichnis kopiert wird, nicht in das Paket aufgenommen.

Gibt es eine Möglichkeit, das 'Veröffentlichen' dazu zu bringen, Dateien einzuschließen, die während eines Post-Build-Ereignisses in das bin-Verzeichnis kopiert wurden?

brodie
quelle
1
Wenn Sie stattdessen ein Pre- Build-Ereignis verwenden, scheint dies bereits zu funktionieren (Visual Studio 2013, ASP.NET-Projektvorlage).
Bzlm
Sie scheinen das im Kommentar oben in Visual Studio 2015 und höher erwähnte vorgefertigte Verhalten entfernt zu haben.
Justdan23

Antworten:

91

Ich beantwortete eine ähnliche, aber andere Frage unter Wie fügen Sie zusätzliche Dateien mithilfe von VS2010-Webbereitstellungspaketen hinzu? .

In Ihrem Szenario, in dem Sie ein Post-Build-Ereignis verwenden, würde ich empfehlen, das Post-Build-Ereignis zu löschen und Ihre Aktionen mithilfe Ihrer eigenen MSBuild-Ziele anstelle eines Post-Build-Ereignisses zu implementieren. Unten finden Sie den Text der anderen Antwort.


Von: Wie fügen Sie zusätzliche Dateien mithilfe von VS2010-Webbereitstellungspaketen ein?


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 dies nicht lesen. 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>
</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 abzurufen. 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, über den es in das Paket eingefügt 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.js 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.

Sagte Ibrahim Hashimi
quelle
1
Danke Sayed, obwohl es nicht die einfachste Methode ist, denke ich, dass es so gemacht wird.
Brodie
8
@Saged, dies scheint für VS2012 nicht zu funktionieren. Wissen Sie, wie dies für dieses Szenario aktualisiert werden kann? Der Wechsel zu v11.0 funktioniert nicht. TIA.
Simon Francesco
2
@Daniel Wenn Sie nur bestimmte Dateien und keinen Ordner benötigen, ändern Sie einfach die _CustomFiles, um diese bestimmten Dateien einzuschließen, anstatt sie rekursiv mit *** hinzuzufügen. Also so etwas wie <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Ähnliches.
Bwerks
3
@SimonFrancesco Ich habe dies ebenfalls erlebt, und die notwendige Änderung scheint darin bestanden zu haben, <CopyAllFilesToSingleFolderForMsdeployDependsOn> anstelle von <CopyAllFilesToSingleFolderForPackageDependsOn> zu erweitern, wie in der obigen Antwort beschrieben.
bwerks
13

Ich habe eine Problemumgehung für das Problem gefunden, indem ich das ExcludeFilesFromDeploymentElement in der Projektdatei verwendet habe. Ich hatte die Idee von Web Deployment: Ausschließen von Dateien und Ordnern

Wenn Sie also Projektdateien so verpacken müssen, wie sie nach einem erfolgreichen Build und den zugehörigen Schritten nach dem Build in Ihrem Projektverzeichnis vorhanden sind, gehen Sie wie folgt vor.

  1. Bearbeiten Sie die Projekteinstellungen für "Paket / Web veröffentlichen" und
    wählen Sie die zu implementierenden Elemente als "Alle Dateien in diesem Projektordner" aus.
  2. Entladen Sie das Projekt
  3. Klicken Sie mit der rechten Maustaste auf das entladene Projekt und wählen Sie, um die Projektkonfiguration zu bearbeiten
  4. Suchen Sie das PropertyGroupElement, das der Konfigurationseinstellung zugeordnet ist, z. B. "Release".
  5. PropertyGroupFügen Sie innerhalb des Elements die folgenden Elemente hinzu und schließen Sie Dateien und Ordner aus, die nicht im Paket enthalten sein sollen

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
  6. Speichern und laden Sie Ihr Projekt neu

Dies löst mein Problem vorerst, aber wenn es eine bessere Lösung gibt, lassen Sie es mich bitte wissen, da dies aufgrund der damit verbundenen Hackerei nicht ideal ist, aber vielleicht ist dies auch ein ungewöhnliches Bereitstellungsszenario?

brodie
quelle
6

Wählen Sie Ihre Dateien oder Ordner aus und ändern Sie die Build-Aktion als Inhalt im Eigenschaftenfenster.

Gomes
quelle
1
Richtig, aber zusätzlich müssen Sie "Kopieren, wenn neuer" oder "Immer kopieren" auswählen, da sonst die Standardaktion "Nicht kopieren" lautet, auch wenn "Inhalt" ausgewählt ist.
Matt
1
stimme mit matt für zusätzlichen schritt überein
Gomes
7
Es gibt keine Build-Aktion für Ordner (VS2013)
Cristian E.
copytooutputdirectory = Immer kopieren
Gomes
Funktionierte auch ohne Copy Always.
Tengiz
3

Ich weiß, dass es eine alte Frage ist, aber keine davon hat bei mir funktioniert.

In 2017 VS habe ich einfach mit der rechten Maustaste auf den zu veröffentlichenden zusätzlichen Ordner geklickt und "Veröffentlichen" ausgewählt.

Beispiel:

Geben Sie hier die Bildbeschreibung ein

user2695433
quelle
Obwohl es ein winziger zusätzlicher Schritt ist, ist es sehr einfach.
Ciaran Gallagher
0

Durch Hinzufügen des Ordners bin (und seines Inhalts) zum Projekt wurden die Dateien in das Veröffentlichungsausgabeverzeichnis kopiert.

Für mich bestand mein Problem darin, dass ich eine proprietäre Softwarelizenzdatei im Ordner bin / ablegen musste, diese aber nicht bei jeder Bereitstellung manuell kopieren wollte.

Hierbei wurde Visual Studio 2015 Professional verwendet

James Wierzba
quelle
0

Ich weiß, dass dies ein altes Gespräch ist, aber ich bin darauf gestoßen, als ich versucht habe, dasselbe zu tun, und ich dachte, es wäre hilfreich, das hinzuzufügen, was ich hier gefunden habe.

Fast alle Artikel über das Einfügen zusätzlicher Dateien in Ihre Publikation verwenden diese Methode zum Hinzufügen der CopyAllFilesToSingleFolderForPackageDependsOnoder der CopyAllFilesToSingleFolderForMSDeployDependsOnElemente in die PropertyGroupund sie alle sind gleich wie "Ich habe dies am Ende der Datei hinzugefügt ...".

Dies tat ich und verbrachte einen Nachmittag damit, herauszufinden, warum nichts passierte, bis mir klar wurde, dass sich PropertyGroupoben in der Datei bereits ein Abschnitt befand. Als ich meine CopyAllFilesToSingleFolderForPackageDependsOnin diesen Abschnitt steckte , funktionierte es gut.

Hoffe, das spart jemandem eines Tages Zeit

john.gleeson
quelle