Schließen Sie Dateien von der in Visual Studio veröffentlichten Website aus

79

Kann ich einen Ordner oder Dateien ausschließen, wenn ich eine Website in Visual Studio 2005 veröffentliche? Ich habe verschiedene Ressourcen, die ich im Projektmappen-Explorer bereithalten möchte, z. B. alternative Konfigurationsdateien für verschiedene Umgebungen, aber ich möchte sie nicht wirklich auf dem Server veröffentlichen. Gibt es eine Möglichkeit, sie auszuschließen? Wenn Sie andere Projekttypen verwenden, z. B. eine DLL-Assembly, kann ich die Build Action-Eigenschaft einer Datei auf "None" und die Copy to Output Directory-Eigenschaft auf "Do not copy" setzen. Ich kann keine ähnlichen Einstellungen für Dateien auf einer Website finden.

Wenn die IDE diese Funktion nicht bietet, hat jemand eine gute Technik für den Umgang mit solchen Dateien?

Jim Snyder
quelle
3
Hier finden Sie eine sehr einfache Lösung: stackoverflow.com/questions/1288858/…
Dmitriy Melnik

Antworten:

32

Wenn Sie die Dateien anhand der Erweiterung identifizieren können, können Sie dies mit dem Tag buildproviders in der Datei web.config konfigurieren . Fügen Sie die Erweiterung hinzu und ordnen Sie sie dem ForceCopyBuildProvider zu. Um beispielsweise XML-Dateien so zu konfigurieren, dass sie mit einer Veröffentlichungsaktion kopiert werden, gehen Sie wie folgt vor:

<configuration>...
    <system.web>...
        <compilation>...
            <buildProviders>
                <remove extension=".xml" />
                <add extension=".xml" type="System.Web.Compilation.ForceCopyBuildProvider" />
            </buildProviders>

Um zu verhindern, dass eine bestimmte Datei kopiert wird, tun Sie dasselbe, verwenden jedoch System.Web.Compilation.IgnoreFileBuildProvider als Typ.

Chris Hynes
quelle
Super cool. Hatte kein Glück mit den empfohlenen ExcludeFromPackageFiles in der Datei wpp.targets. Letzteres ist ziemlich nutzlos, da es keine Platzhalter mit Ordnern zu unterstützen scheint, die mehr als eine Ebene tief sind. Danke
DvS
127

Ausschließen von Dateien und Ordnern durch Hinzufügen ExcludeFilesFromDeploymentund ExcludeFoldersFromDeploymentElemente in Ihre Projektdatei (CSPROJ, .vbproj, etc). Sie müssen die Datei in einem Texteditor oder in Visual Studio bearbeiten, indem Sie das Projekt entladen und anschließend bearbeiten.

Fügen Sie die Tags an einer beliebigen Stelle im entsprechenden Bereich PropertyGroup(Debug, Release usw.) hinzu, wie unten gezeigt:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
  ... 
  <ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment> 
  <ExcludeFilesFromDeployment>**\.svn\**\*.*</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment> 
</PropertyGroup>

Platzhalter werden unterstützt.

Um das obige Beispiel zu erklären:

  • Der 1. ExcludeFilesFromDeploymentschließt File1.aspx(im Stammverzeichnis des Projekts) und Folder2\File2.aspx( Folder2im Stammverzeichnis des Projekts) aus
  • Die zweite ExcludeFilesFromDeploymentOption schließt alle Dateien in einem beliebigen Ordner aus.svn und einem seiner Unterordner aus
  • Die ausgeschlossenen ExcludeFoldersFromDeploymentOrdner mit dem Namen Folder1(im Stammverzeichnis des Projekts) und Folder2\Folder2a( Folder2im Stammverzeichnis des Projekts)

Weitere Informationen finden Sie im MSDN-Blogbeitrag Webbereitstellung: Ausschließen von Dateien und Ordnern über die Projektdatei der Webanwendung

Keith
quelle
1
Gibt es eine Möglichkeit, damit Platzhalter zu verwenden?
Roydukkey
4
Dies ist viel besser als die akzeptierte Antwort für mich, da ich die Datei Web.config während der Veröffentlichung ausschließen möchte!
Michael Eakins
6
Bei Projekten vom Typ "Website" wird dieses Codefragment zu den * .pubxml-Dateien in ~ / App_Data / PublishProfiles / hinzugefügt.
Laylarenee
4
In einer Webanwendung können Sie diese Elemente zur PropertyGroup Ihres Veröffentlichungsprofils hinzufügen @ ~ \ Properties \ PublishProfiles
ExecutionOrder
6
Gibt es eine Möglichkeit, dies über die Benutzeroberfläche zu tun, anstatt die Projektdatei direkt zu bearbeiten?
Kurren
35

Erstaunlicherweise ist die Antwort für Visual Studio 2012 nicht hier:

  • Die Antwort mit grünem Häkchen ist nicht die Antwort.

  • Die höchste "erhöhte" Antwort verweist auf einen Artikel aus dem Jahr 2010 und besagt, dass Sie Ihre csproj-Projektdatei bearbeiten müssen, die jetzt falsch ist. Ich habe das ExcludeFoldersFromDeployment-XML-Element zu meiner Visual Studio 2012-csproj-Datei hinzugefügt und es hat nichts getan. Das Element wurde als ungültig angesehen. Dies liegt daran, dass ExcludeFoldersFromDeployment in die .pubxml-Datei verschoben wurde, wie es aussieht.

Für Webanwendungen und Websites bearbeiten Sie die .pubxml-Datei!

Sie können meiner Antwort folgen oder diese Anleitung ausprobieren, die ich später gefunden habe: http://www.leniel.net/2014/05/using-msdeploy-publish-profile-pubxml-to-create-an-empty-folder-structure- on-iis-and-skip-delete-it-with-msdeployskiprules.html # sthash.MSsQD8U1.dpbs

Ja, Sie können dies nicht nur für Website-Projekte, sondern auch für Websites tun. Ich habe lange Zeit im Internet nach dieser schwer fassbaren Ausschlussmöglichkeit mit einer Visual Studio-Website (NICHT Website-Projekt) gesucht und war zuvor zu dem Schluss gekommen, dass dies nicht möglich ist, aber es sieht so aus:

Fügen Sie in Ihrer .pubxml-Datei [mypublishwebsitename], die sich in ~ / Properties / PublishProfiles für Webanwendungsprojekte und ~ / App_Data / PublishProfiles für Websites befindet, einfach Folgendes hinzu:

  <ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment> 
 <ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment>

als Kinder zum <PropertyGroup>Hauptelement in Ihrer .pubxml-Datei. Sie müssen kein neues Element hinzufügen, es sei denn, Sie geben einen bestimmten Build-Typ wie Release oder Debug ein.

ABER WARTE!!!

Wenn Sie Dateien von Ihrem Ziel- / Zielserver mit der folgenden Einstellung in Ihrer Veröffentlichungskonfiguration entfernen:

Geben Sie hier die Bildbeschreibung ein

Dann löscht der Webveröffentlichungsprozess auf Ihrem Quell- / Zielserver alles Ausgeschlossene, wie z. B. ein Element, das Sie in Ihrem <ExcludeFoldersFromDeployment>und <ExcludeFilesFromDeployment>!

MsDeploy Skip Rules zur Rettung:

Erstens verwendet Web Publish etwas anderes als MSBuild zum Veröffentlichen (Task IO oder ähnliches genannt), hat jedoch einen Fehler und erkennt keine Überspringregeln. Daher müssen Sie Ihrer .pubxml Folgendes hinzufügen:

<PropertyGroup>
    <WebPublishMethod>MSDeploy</WebPublishMethod>
</PropertyGroup>

Ich würde halten <WebPublishMethod>in seinem eigenen <PropertyGroup>, würden Sie denken, Sie nur eine haben könnten <PropertyGroup>in Ihrer .pubxml Element aber meine überspringen Regeln wurden nicht genannt zu werden , bis ich zog <WebPublishMethod>zu seinem eigenen <PropertyGroup>Elemente. Ja, verrückt, aber die Tatsache, dass Sie all dies tun müssen, damit Web Publish einen Ordner / eine Datei auf Ihrem Server ausschließt und auch nicht löscht, ist verrückt.

Jetzt meine aktuellen SkipRules-, ExcludeFolders- und ExcludeFiles-Deklarationen in meiner .pubxml:

<ExcludeFoldersFromDeployment>Config</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Photos</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Temp</ExcludeFoldersFromDeployment>
<ExcludeFilesFromDeployment>Web.config</ExcludeFilesFromDeployment>
 <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>

Und jetzt die Überspringregeln ( <Target>ist ein Kind von <Project>in Ihrer .pubxml): ( Sie können <SkipAction>Skip möglicherweise für alle Aktionen leer lassen, aber ich habe das nicht getestet und bin mir nicht sicher.

  <Target Name="AddCustomSkipRules">
    <Message Text="Adding Custom Skip Rules" />
    <ItemGroup>
      <MsDeploySkipRules Include="SkipConfigFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Config</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipPhotosFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Photos</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipWebConfig">
        <SkipAction>Delete</SkipAction>
        <ObjectName>filePath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Web\.config</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipWebConfig">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Temp</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>

Und bitte vergessen Sie nicht, die .Regel in einem filePath Skip mit einem Backslash zu umgehen.

Brian Ogden
quelle
11

Ich hatte mit dem gleichen Problem zu kämpfen und drückte schließlich den Auslöser für die Konvertierung der Website in eine Webanwendung. Sobald ich dies getan habe, habe ich alle IDE-Vorteile wie Build-Aktionen erhalten und es wurde schneller zum Booten kompiliert (keine validierende Website mehr ...).

Schritt 1: Konvertieren Sie Ihre "Website" in eine "Webanwendung". Um es zu konvertieren, habe ich gerade eine neue "Webanwendung" erstellt, alle automatisch erstellten Dateien weggeblasen und meine Website kopiert und eingefügt. Dies hat gut funktioniert. Beachten Sie, dass für Berichtsdateien die Build-Aktion auf "Inhalt" anstatt auf "Keine" gesetzt sein muss.

Schritt 2: Jetzt können Sie die Eigenschaft "Build Action" für alle Dateien festlegen.

Hoffe das hilft.

BlackjacketMack
quelle
7

In Visual Studio 2013 fand ich, dass die Antwort von Keith, das ExcludeFoldersFromDeploymentElement zur Projektdatei hinzuzufügen , nicht funktionierte (ich hatte die Antwort von Brian Ogden, die dies sagt, nicht gelesen). Ich stellte jedoch fest, dass ich eine Textdatei beim Veröffentlichen in Visual Studio 2013 ausschließen konnte, indem ich nur die folgenden Eigenschaften für die Textdatei selbst festlegte:

1) Build-Aktion: Keine

2) In Ausgabeverzeichnis kopieren: Nicht kopieren

Anfangs habe ich versucht, die Eigenschaft "In Ausgabeverzeichnis kopieren" selbst festzulegen, aber das hat nicht funktioniert, als die Build-Aktion auf den Standardwert "Inhalt" gesetzt wurde. Als ich dann die Build-Aktion auf Keine setzte, wurde die Textdatei beim Veröffentlichen nicht mehr in den Zielordner kopiert.

Um diese Eigenschaften in der Visual Studio-Benutzeroberfläche anzuzeigen, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei, die Sie ausschließen möchten, und wählen Sie Eigenschaften aus dem Kontextmenü aus.

Simon Tewsi
quelle
Dies funktioniert in Visual Studio 2015, das in Azure veröffentlicht wird.
Chris
2
Problem ist, wenn Sie Dateien nur für bestimmte Zielumgebungen (Build-Konfigurationen) ausschließen müssen. Das ist schmerzhaft.
Benmccallum
5

Ich denke, Sie haben hier nur zwei Möglichkeiten:

  • Verwenden Sie die Funktion "Vom Projekt ausschließen". Dies ist nicht ideal, da das Projektelement von allen integrierten IDE-Quellcodeverwaltungsvorgängen ausgeschlossen wird. Sie müssten im Lösungsfenster auf die Schaltfläche "Alle Dateien anzeigen" klicken, wenn Sie die Dateien im Projektmappen-Explorer anzeigen möchten, aber auch Dateien und Ordner, an denen Sie nicht interessiert sind.
  • Verwenden Sie ein Post-Build-Ereignisskript, um alle Projektelemente zu entfernen, die nicht veröffentlicht werden sollen (vorausgesetzt, Sie veröffentlichen in einem lokalen Ordner und laden sie dann auf den Server hoch).

Ich habe das schon einmal durchgemacht und konnte mir nichts wirklich Elegantes einfallen lassen.

Kev
quelle
2

Für Visual Studio 2017 WebApp Publish , zunächst ein Standard-Veröffentlichungssystemprofil für Dateisysteme. Wechseln Sie in den Ordner App_Data \ PublishProfiles \ und bearbeiten Sie die .pubxml-Datei [Profilname].

Hinzufügen

<ExcludeFilesFromDeployment>[file1.ext];[file2.ext];[file(n).ext]</ExcludeFilesFromDeployment>

unter dem Tag <PropertyGroup> Sie können dieses Tag nur einmal angeben, andernfalls werden nur die Werte des letzten verwendet.

Beispiel:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>True</ExcludeApp_Data>
    <publishUrl>C:\inetput\mysite</publishUrl>
    <DeleteExistingFiles>False</DeleteExistingFiles>
    <ExcludeFilesFromDeployment>web.config;mysite.sln;App_Code\DevClass.cs;</ExcludeFilesFromDeployment>
  </PropertyGroup>
</Project>

Stellen Sie sicher, dass das Tag DeleteExistingFiles auf False gesetzt ist

Nico Dreyer
quelle
Nico bist du vom GP? Für MCI gearbeitet?
Namphibian
1

Die gesuchte Funktion ist vorhanden, wenn Ihr Projekt als "Webanwendung" erstellt wurde. Web - Site „Projekte“ sind nur eine Sammlung von Dateien , die als 1 gedacht sind: 1 mit dem, was zu einem Web - Server bereitgestellt wird.

In Bezug auf die Funktionalität sind beide gleich, jedoch kompiliert eine Webanwendung den gesamten Quellcode in eine DLL, anstatt die nackten Quellcodedateien auf den Webserver zu kopieren und nach Bedarf zu kompilieren.

David
quelle
0

In Visual Studio 2017 (in meinem Fall 15.9.3) funktioniert die Manipulation der .csproj-Datei in der Tat einwandfrei! Die pubxml muss nicht geändert werden.

Sie können dann unter Verwendung der PropertyGroup-Bedingung ziemlich schöne Einstellungen in der .csproj-Datei erstellen, z.

  <PropertyGroup Condition="$(Configuration.StartsWith('Pub_'))">
    <ExcludeFoldersFromDeployment>Samples</ExcludeFoldersFromDeployment>
  </PropertyGroup>

schließt den Ordner "Samples" von allen Bereitstellungen mit Konfigurationen aus, die mit "Pub _" beginnen ...

Markus R.
quelle
Ich überprüfe, ob dies für Visual Studio 2017 funktioniert, ohne die Eigenschaft "Bedingung" anzuwenden.
Erdem KAYA
0

Als zeitgemäße Antwort in Visual Studio 2017 mit einer .net-Core-Site:

Sie können die Veröffentlichung wie folgt im csproj ausschließen, wo sich CopyToPublishDirectory niemals befindet.

  <ItemGroup>
    <Content Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </Content>
    <Content Update="appsettings.Local.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </Content>
  </ItemGroup>

Dies wird hier ausführlicher erläutert: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.2

<PropertyGroup>
    <ExcludeFilesFromDeployment>appsettings.Local.json</ExcludeFilesFromDeployment>
</PropertyGroup>

Die früheren Vorschläge haben bei mir nicht funktioniert, ich vermute, weil Visual Studio jetzt einen anderen Veröffentlichungsmechanismus darunter verwendet, vermutlich über das CLI-Tool "dotnet Publish" oder ein gleichwertiges darunter.

Alex KeySmith
quelle
0

Dies ist nur ein Nachtrag zu den anderen hilfreichen Antworten hier und etwas, das ich nützlich fand ...

Verwenden von wpp.targets zum Ausschließen von Dateien und Ordnern

Wenn Sie mehrere Bereitstellungen für verschiedene Umgebungen haben, ist es hilfreich, nur eine gemeinsame Datei zu haben, in der Sie alle ausgeschlossenen Dateien und Ordner festlegen können. Sie können dies tun, indem Sie eine *.wpp.targetsDatei im Stammverzeichnis des Projekts erstellen, wie im folgenden Beispiel dargestellt.

Weitere Informationen finden Sie in diesem Microsoft-Handbuch:

Gewusst wie: Bearbeiten der Bereitstellungseinstellungen in Veröffentlichungsprofildateien (.pubxml) und der Datei .wpp.targets in Visual Studio-Webprojekten

<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <EnableMSDeployAppOffline>True</EnableMSDeployAppOffline>
    <ExcludeFilesFromDeployment>
      *.config;
      *.targets;
      *.default;
    </ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>
      images;
      videos;
      uploads;
    </ExcludeFoldersFromDeployment>
  </PropertyGroup>
</Project>
Roberto
quelle