webentwicklung-frage-antwort-db.com.de

Stellen Sie sicher, dass MSDeploy (Visual Studio) den Ordner App_Data nicht löscht, sondern alles andere

Ich verwende die Publish-Schaltfläche von Visual Studio, um meine Website bereitzustellen, und möchte einen anderen App_Data-Ordner auf dem Server. Es gibt ein Kontrollkästchen für Leave extra files on destination (do not delete), das verhindert, dass mein App_Data-Ordner gelöscht wird. Dann werden jedoch bei einer Änderung der Website viele verbliebene Dateien angesammelt.

Gibt es eine Möglichkeit, nur App_Data auszuschließen, wenn alles gelöscht wird?

55
Rei Miyasaka

Dies ist möglich, wenn Sie msdeploy manuell aufrufen. Fügen Sie einfach den folgenden Parameter hinzu:

-skip:Directory=\\App_Data

Siehe Web Deploy-Betriebseinstellungen . Der Pfad ist ein regulärer Ausdruck und daher recht flexibel.

Wenn Sie die Bereitstellung mit dem VS-generierten ProjectName.deploy.cmd-Skript durchführen, können Sie diesen Parameter auch in der Umgebungsvariablen _MsDeployAdditionalFlags übergeben (wenn Sie dieses Skript ausführen).

Dies ist das Beste, das ich für unsere Bedürfnisse gefunden habe (wir haben eine ähnliche Situation wie Sie). Ich habe nicht versucht, sie mit der Schaltfläche "Veröffentlichen" von VS zu integrieren, seit wir sie von der Befehlszeile aus bereitstellen.

EDIT:

Ich habe ein paar Dinge über MSDeploy gelernt, seit ich diese Antwort gepostet habe, also dachte ich, ich würde sie jetzt aktualisieren.

Zunächst überspringt die obige Ausblendregel alle Vorgänge auf dem übereinstimmenden Pfad (App_Data). Wenn eine genauere Kontrolle erforderlich ist, steht eine ausführlichere Syntax zur Verfügung. Um beispielsweise nur Löschungen zu überspringen (um zusätzliche Dateien auf dem Zielserver zu behalten, jedoch neue hinzuzufügen und vorhandene zu aktualisieren):

-skip:skipaction='Delete',objectname='filePath',absolutepath='\\App_Data\\.*' -skip:skipaction='Delete',objectname='dirPath',absolutepath='\\App_Data\\.*'

Dies überspringt das Löschen aller Dateien und aller Unterordner (mit ihrem gesamten Inhalt) in App_Data, verhindert jedoch nicht das Hinzufügen und Aktualisieren.

Eine weitere nützliche Sache ist, dass Überspringregeln in der Projektdatei (.csproj) definiert werden können, sodass sie automatisch in das mit dem Paket generierte .deploy.cmd-Skript aufgenommen werden. Dadurch ist es nicht erforderlich, sie über _MsDeployAdditionalFlags an das Skript zu übergeben.

Die obige Ausblendregel wird hinzugefügt, wenn Folgendes in csproj-Datei enthalten ist:

<PropertyGroup>
  <OnBeforePackageUsingManifest>AddCustomSkipRules</OnBeforePackageUsingManifest>
</PropertyGroup>
<Target Name="AddCustomSkipRules">
  <ItemGroup>
    <MsDeploySkipRules Include="SkipDeleteAppData">
      <SkipAction>Delete</SkipAction>
      <ObjectName>filePath</ObjectName>
      <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
      <XPath>
      </XPath>
    </MsDeploySkipRules>
    <MsDeploySkipRules Include="SkipDeleteAppData">
      <SkipAction>Delete</SkipAction>
      <ObjectName>dirPath</ObjectName>
      <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
      <XPath>
      </XPath>
    </MsDeploySkipRules>
  </ItemGroup>
</Target>

(Die Namen AddCustomSkipRules und SkipDeleteAppData sind völlig willkürlich; $(_Escaped_PackageTempDir) soll möglicherweise benötigt werden, aber in der Praxis habe ich immer gesehen, dass sie einen leeren String auswertet.

Siehe Web Deploy: Anpassen eines Implementierungspakets und So legen Sie die MSDeploy-Einstellungen in der .csproj-Datei fest Weitere Informationen.

Eine Einschränkung: Dies fügt dem .deploy.cmd-Skript nur diese Regeln hinzu. Daher ist es nutzlos, wenn Sie den grafischen IIS -Manager für die Paketbereitstellung verwenden möchten, da er dieses Skript nicht verwendet VS, aber ich habe nicht nachgesehen.

92

Haben Sie sich in den Projekteinstellungen Package/Publish Web angesehen, weil Sie Dateien im Ordner "App_Data" ausschließen können.

1
Bob Vale

Dies ist nicht ideal, da Sie viele Dateien kopieren (ich bin es nicht), aber hier ist meine Lösung zum Sichern eines Ordners. Angepasst, um den Ordner während des Veröffentlichungsvorgangs an den Ort zu verschieben, von dem aus er veröffentlicht wird. Fügen Sie dies in Ihre pubxml-Datei ein:

<Project>
...
<Target Name="PreserveSelectedFolder" AfterTargets="GatherAllFilesToPublish">
   <ItemGroup>
     <SITEDIR Include="$(publishUrl)\App_Data\**\*.*" />
   </ItemGroup>
   <Copy SourceFiles="@(SITEDIR)" 
      DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\%(RecursiveDir)"></Copy>
</Target>
</Project>

Wenn Sie nur eine bestimmte Anzahl von bekannten Dateien erstellen möchten, führen Sie einen Kopierblock pro Datei aus:

<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish"  >
    <Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT" 
      DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\" 
      Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>
0
Brett Lalonde

Nach meiner Erfahrung werden MsDeploySkipRules nur ausgeführt, wenn sie von der Befehlszeile aus bereitgestellt werden.

Wenn Sie von Visual Studio aus in Azure veröffentlichen (oder eine andere Web Deploy-Methode verwenden), können Sie beim Veröffentlichen Folgendes festlegen.

  • Entfernen Sie zusätzliche Dateien am Zielort
  • Dateien aus dem App_Data-Ordner ausschließen

Wenn "Zusätzliche Dateien am Ziel entfernen" markiert ist, wird ein Vergleich zwischen den Dateien und Ordnern, die Sie bereitstellen, und den Dateien auf dem Server verglichen.

Seien Sie gewarnt, es kann zu Problemen kommen, wenn Sie vom Benutzer generierte Inhalte haben, z. Uploads Dies könnte jedoch umgangen werden, indem diese Ordner an einem anderen Ort gespeichert werden, z. S3/Azure-Speicher.

 Web Publishing Profile

0
uniquelau

Wenn Sie von Powershell aus msdeploy.exe oder die bei der Veröffentlichung mit Web Deploy Package erstellte Datei myproj.deploy.cmd ( Deploying Web Packages ) verwenden möchten, um das Löschen des Ordners App_Data zu überspringen und den

All arguments must begin with "-"

fehler, müssen Sie die Skip-Direktive in dreifache Anführungszeichen einschließen, z. :

myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""
0
lef

Für asp.net-Kern-Web-Apps verwenden Sie MsDeploySkipRules in csproj.

<ItemGroup>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>filePath</ObjectName>
    <AbsolutePath><dir_name>\\app_data</AbsolutePath>
  </MsDeploySkipRules>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>dirPath</ObjectName>
    <AbsolutePath><dir_name>\\app_data</AbsolutePath>
  </MsDeploySkipRules>
</ItemGroup>

Ersetzen Sie <dir_name> durch Ihren Stammordner

https://docs.Microsoft.com/en-us/aspnet/core/Host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.1#exclude-files

0
Guido Neele