webentwicklung-frage-antwort-db.com.de

Wie bekomme ich die Veröffentlichungsfunktion von Visual Studio, um Dateien vom Post Build-Ereignis einzuschließen?

Ich versuche derzeit, die Studio Publish- und MSDeploy-Funktionalität von Visual Studio 2010 zu verwenden, um meine Webbereitstellungsanforderungen zu erfüllen, habe jedoch einen Roadblock in Bezug auf die Anpassung des Pakets in Abhängigkeit von meiner Build-Konfiguration erhalten.

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

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

85
brodie

Ich habe eine ähnliche, aber andere Frage beantwortet unter Wie fügen Sie mithilfe von VS2010-Webbereitstellungspaketen zusätzliche Dateien 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 mit Ihren eigenen MSBuild-Zielen anstelle des Post Build-Ereignisses zu implementieren. Nachfolgend finden Sie den Text der anderen Antwort.


From: Wie fügen Sie zusätzliche Dateien mit den VS2010-Webbereitstellungspaketen hinzu?


Tolle Frage. Ich habe gerade einen ausführlichen Blogeintrag zu diesem Thema im Web Deployment Tool (MSDeploy) veröffentlicht: Paket erstellen, einschließlich zusätzlicher Dateien oder Ausschließen bestimmter Dateien .

Hier ist die Zusammenfassung. Nach dem Einfügen von Dateien zeige ich, wie Dateien ebenfalls ausgeschlossen werden.

Einschließlich zusätzlicher Dateien

Das Einfügen zusätzlicher Dateien in das Paket ist etwas schwieriger, aber immer noch kein Wunder, 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 einhaken, in dem die Dateien zum Verpacken gesammelt werden. Das zu erweiternde Ziel heißt CopyAllFilesToSingleFolder. Dieses Ziel verfügt über eine Abhängigkeitseigenschaft, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, die wir für unser eigenes Ziel nutzen können. Also erstellen wir ein Ziel namens CustomCollectFiles und fügen es in den Prozess ein. Dies erreichen wir mit folgendem (erinnern Sie sich an die Import-Anweisung).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

Dies wird unser Ziel zum Prozess hinzufügen. Jetzt müssen wir das Ziel selbst definieren. Nehmen wir an, Sie haben einen Ordner namens Extra Files, der eine Ebene über Ihrem Webprojekt liegt. Sie möchten alle diese Dateien einschließen. Hier ist das CustomCollectFiles-Ziel und wir diskutieren danach.

<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 gesagt, es soll alle Dateien in diesem Ordner und alle darin befindlichen Ordner abholen. Dann verwende ich dieses Element, um das FilesForPackagingFromProject-Element aufzufüllen. Dies ist das Element, das MSDeploy tatsächlich zum Hinzufügen zusätzlicher Dateien verwendet. Beachten Sie auch, dass ich den Metadaten-DestinationRelativePath-Wert deklariert habe. Dies bestimmt den relativen Pfad, den es im Paket finden soll. Ich habe hier die Anweisung Extra Files% (RecursiveDir)% (Filename)% (Extension) verwendet. Das heißt, es wird an demselben relativen Speicherort im Paket abgelegt wie unter dem Ordner Extra Files.

Dateien ausschließen

Wenn Sie die Projektdatei einer mit VS 2010 erstellten Webanwendung am unteren Rand ö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 die Projektauswahl, und klicken Sie dann auf Projekt entfernen. 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 Anpassungen sollten nach dem Import erfolgen, wenn Sie sich nicht sicher sind, ob Sie danach sind! Wenn Sie Dateien zum Ausschließen haben, gibt es einen Elementnamen, ExcludeFromPackageFiles, der dazu verwendet werden kann. Angenommen, Sie haben eine Datei mit dem Namen Sample.Debug.js, die in Ihrer Webanwendung enthalten ist, die Datei jedoch von den erstellten Paketen ausgeschlossen werden soll. Sie können das Snippet unterhalb dieser Importanweisung einfügen.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

Durch das Ausfüllen dieses Elements 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 dies immer angeben müssen.

82

Ich habe eine Problemumgehung für das Problem gefunden, indem ich das Element ExcludeFilesFromDeployment in der Projektdatei verwende. Ich kam auf die Idee von Web Deployment: Dateien und Ordner ausschließen

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

  1. Bearbeiten Sie die Projekteinstellungen "Package/Publish Web" und
    Wählen Sie "Zu verarbeitende 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 PropertyGroup-Element, das der Konfigurationseinstellung zugeordnet ist, z. "Veröffentlichung"
  5. Fügen Sie im PropertyGroup-Element 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 Sie Ihr Projekt und laden Sie es erneut

Dies löst mein Problem vorerst, aber wenn es eine bessere Lösung gibt, lassen Sie es mich bitte wissen, da dies aufgrund der Hackerangriffe nicht ideal ist.

12
brodie

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

4
Gomes

Ich weiß, dass es eine alte Frage ist, aber keine davon funktionierte für mich. 

In 2017 VS habe ich einfach mit der rechten Maustaste auf den zusätzlichen Ordner geklickt, der veröffentlicht werden soll. 

Beispiel: 

 enter image description here

1
user2695433

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

In fast allen Artikeln, die zusätzliche Dateien in Ihre Publikation aufnehmen, wird diese Methode zum Hinzufügen der Elemente CopyAllFilesToSingleFolderForPackageDependsOn oder CopyAllFilesToSingleFolderForMSDeployDependsOn in PropertyGroup verwendet. Sie alle gleichen etwas wie "Ich habe dies am Ende der Datei hinzugefügt ..."

Dies ist, was ich tat und verbrachte einen Nachmittag damit, herauszufinden, warum nichts passiert, bis ich merkte, dass es bereits einen PropertyGroup-Abschnitt oben in der Datei gab. Wenn ich meine CopyAllFilesToSingleFolderForPackageDependsOn in diesen Abschnitt einfügte, hat es gut funktioniert.

Hoffe, das spart jemandem eines Tages Zeit

0
john.gleeson

Hinzufügen des bin-Ordners (und dessen Inhalt) zum Projekt hat dazu geführt, dass die Dateien in das Ausgabeverzeichnis für Veröffentlichungen kopiert wurden.

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

Hierbei wurde Visual Studio 2015 Professional verwendet

0
James Wierzba