Wyklucz pliki z witryny sieci Web, publikuj w programie Visual Studio

79

Czy mogę wykluczyć folder lub pliki podczas publikowania witryny sieci Web w programie Visual Studio 2005? Mam różne zasoby, które chcę mieć pod ręką w Eksploratorze rozwiązań, takie jak alternatywne pliki konfiguracyjne dla różnych środowisk, ale tak naprawdę nie chcę publikować ich na serwerze. Czy jest jakiś sposób, aby je wykluczyć? Korzystając z innych typów projektów, takich jak zespół .dll, mogę ustawić właściwość Akcji kompilacji pliku na „Brak”, a właściwość Kopiuj do katalogu wyjściowego na „Nie kopiuj”. Nie mogę znaleźć podobnych ustawień dla plików w witrynie internetowej.

Jeśli IDE nie oferuje tej funkcji, czy ktoś ma dobrą technikę obsługi takich plików?

Jim Snyder
źródło
3
Tutaj możesz znaleźć bardzo proste rozwiązanie: stackoverflow.com/questions/1288858/…
Dmitriy Melnik

Odpowiedzi:

32

Jeśli możesz zidentyfikować pliki na podstawie rozszerzenia, możesz to skonfigurować za pomocą tagu buildproviders w pliku web.config . Dodaj rozszerzenie i zamapuj je na ForceCopyBuildProvider. Na przykład, aby skonfigurować kopiowanie plików .xml za pomocą akcji publikowania, należy wykonać następujące czynności:

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

Aby zapobiec kopiowaniu danego pliku, zrobiłbyś to samo, ale jako typ użyj System.Web.Compilation.IgnoreFileBuildProvider.

Chris Hynes
źródło
Super fajne. Nie miałem szczęścia z zalecanymi plikami ExcludeFromPackageFiles w pliku wpp.targets. Ta ostatnia jest dość bezużyteczna, ponieważ wydaje się, że nie obsługuje symboli wieloznacznych z folderami o głębokości większej niż jeden poziom. Dzięki
DvS
128

Wyklucz pliki i foldery, dodając elementy ExcludeFilesFromDeploymenti ExcludeFoldersFromDeploymentdo pliku projektu (.csproj, .vbproj itp.). Będziesz musiał edytować plik w edytorze tekstu lub w programie Visual Studio, zwalniając projekt, a następnie edytując go.

Dodaj tagi w dowolnym miejscu odpowiedniego PropertyGroup(debugowania, wydania itp.), Jak pokazano poniżej:

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

Obsługiwane są symbole wieloznaczne.

Aby wyjaśnić powyższy przykład:

  • Pierwszy ExcludeFilesFromDeploymentwyklucza File1.aspx(w katalogu głównym projektu) i Folder2\File2.aspx( Folder2jest w katalogu głównym projektu)
  • Drugi ExcludeFilesFromDeploymentwyklucza wszystkie pliki w dowolnym nazwanym folderze .svni wszystkich jego podfolderach
  • W ExcludeFoldersFromDeploymentWyklucza foldery o nazwach Folder1(w głównym katalogu projektu) i Folder2\Folder2a( Folder2znajduje się w katalogu głównym projektu)

Aby uzyskać więcej informacji, zobacz wpis w blogu MSDN Wdrażanie w sieci Web: wykluczanie plików i folderów za pośrednictwem pliku projektu aplikacji sieci Web

Keith
źródło
1
Czy istnieje sposób na użycie w tym celu symboli wieloznacznych?
roydukkey
4
Jest to o wiele lepsze niż zaakceptowana odpowiedź, ponieważ chcę wykluczyć plik Web.config podczas publikowania!
Michael Eakins
6
W projektach typu „Witryna sieci Web” ten fragment kodu jest dodawany do plików * .pubxml znajdujących się w ~ / App_Data / PublishProfiles /.
laylarenee
4
W aplikacji internetowej możesz dodać te elementy do grupy PropertyGroup, w której opublikujesz profil @ ~ \ Properties \ PublishProfiles
ExecutionOrder
6
Czy istnieje sposób, aby to zrobić za pośrednictwem interfejsu użytkownika, zamiast bezpośrednio edytować plik projektu?
Kurren,
35

O dziwo, odpowiedzi na Visual Studio 2012 nie ma tutaj:

  • Odpowiedź z zielonym znacznikiem wyboru nie jest odpowiedzią.

  • Najwyższa „ulepszona” odpowiedź odnosi się do artykułu z 2010 roku i mówi, że musisz edytować plik projektu csproj, który jest teraz nieprawidłowy. Dodałem ExcludeFoldersFromDeployment element XML do mojego pliku csproj programu Visual Studio 2012 i nic to nie dało, element został uznany za nieprawidłowy, ponieważ ExcludeFoldersFromDeployment został przeniesiony do pliku .pubxml, na który wygląda.

W przypadku aplikacji i witryn internetowych edytujesz plik .pubxml!

Możesz skorzystać z mojej odpowiedzi lub wypróbować ten przewodnik, który znalazłem później: http://www.leniel.net/2014/05/using-msdeploy-publish-profile-pubxml-to-create-an-empty-folder-structure- on-iis-and-skip-deleting-it-with-msdeployskiprules.html # sthash.MSsQD8U1.dpbs

Tak, możesz to zrobić nie tylko w przypadku projektów witryn internetowych, ale także witryn internetowych. Spędziłem dużo czasu w Internecie, szukając tej nieuchwytnej możliwości wykluczania za pomocą witryny Visual Studio (NIE projektu witryny internetowej) i wcześniej stwierdziłem, że nie jest to możliwe, ale wygląda na to, że:

W pliku [mypublishwebsitename] .pubxml, znajdującym się w ~ / Properties / PublishProfiles for Web Application Projects i ~ / App_Data / PublishProfiles for Websites, po prostu dodaj:

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

jako dzieci do głównego <PropertyGroup>elementu w pliku .pubxml. Nie ma potrzeby dodawania nowego elementu, chyba że kluczem jest określony typ kompilacji, taki jak wydanie lub debugowanie.

ALE POCZEKAJ!!!

Jeśli usuwasz pliki z serwera docelowego / docelowego z następującymi ustawieniami w konfiguracji publikowania:

wprowadź opis obrazu tutaj

Następnie proces publikowania w sieci Web usunie z serwera źródłowego / docelowego wszystko, co zostało wykluczone, na przykład element, który nakreśliłeś w swoim <ExcludeFoldersFromDeployment>i <ExcludeFilesFromDeployment>!

MsDeploy Skip Rules to ratunek:

Po pierwsze, Web Publish używa do publikowania czegoś innego niż MSBuild (zwanego Task IO lub czegoś podobnego), ale zawiera błąd i nie rozpoznaje reguł pomijania, więc musisz dodać do swojego .pubxml:

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

Chciałbym zachować <WebPublishMethod>swój własny <PropertyGroup>, można by pomyśleć, że możesz mieć tylko jeden <PropertyGroup>element w swoim .pubxml, ale moje reguły pomijania nie były wywoływane, dopóki nie przeniosłem się <WebPublishMethod>do ich własnego <PropertyGroup>elementu. Tak, szalone, ale fakt, że musisz to wszystko zrobić, aby Web Publish wykluczył, a także nie usunął folderu / pliku na serwerze, jest szalony.

Teraz moje rzeczywiste deklaracje SkipRules, ExcludeFolders i ExcludeFiles w moim .pubxml:

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

A teraz Reguły pomijania ( <Target>jest elementem podrzędnym <Project>w twoim .pubxml): ( Możesz zostawić <SkipAction>puste pole Pomiń dla wszystkich działań, ale nie testowałem tego i nie jestem pewien.

  <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>

I proszę, nie zapomnij o ucieczce przed .regułą pomijania ścieżki w pliku z ukośnikiem odwrotnym.

Brian Ogden
źródło
11

Zmagałem się z tym samym problemem i ostatecznie pociągnąłem za spust podczas konwersji strony internetowej do aplikacji internetowej. Kiedy to zrobiłem, uzyskałem wszystkie korzyści z IDE, takie jak akcja kompilacji, i skompilowałem się szybciej do rozruchu (koniec z walidacją strony internetowej ...).

Krok 1: Przekształć swoją „witrynę internetową” w „aplikację internetową”. Aby go przekonwertować, właśnie utworzyłem nową „aplikację internetową”, usunąłem wszystkie pliki, które utworzyła automatycznie, a następnie skopiowałem i wkleiłem moją witrynę internetową. To działało dobrze. Pamiętaj, że pliki raportów będą musiały mieć ustawioną Akcję budowania na „Treść” zamiast „Brak”.

Krok 2: Teraz możesz ustawić właściwość „Build Action” dowolnych plików.

Mam nadzieję że to pomoże.

BlackjacketMack
źródło
7

W Visual Studio 2013 znalazłem odpowiedź Keitha, dodając rozszerzenie ExcludeFoldersFromDeployment elementu do pliku projektu, nie zadziałało (nie przeczytałem odpowiedzi Briana Ogdena, która to mówi). Jednak stwierdziłem, że mogę wykluczyć plik tekstowy podczas publikowania w programie Visual Studio 2013, ustawiając po prostu następujące właściwości w samym pliku tekstowym:

1) Akcja budowy: brak

2) Kopiuj do katalogu wyjściowego: Nie kopiuj

Początkowo próbowałem samodzielnie ustawić właściwość Kopiuj do katalogu wyjściowego, ale to nie zadziałało, gdy akcja kompilacji została ustawiona na wartość domyślną, zawartość. Kiedy następnie ustawiłem akcję kompilacji na Brak, plik tekstowy nie był już kopiowany do folderu docelowego podczas publikacji.

Aby wyświetlić te właściwości w graficznym interfejsie użytkownika programu Visual Studio, w Eksploratorze rozwiązań kliknij prawym przyciskiem myszy plik, który chcesz wykluczyć, i wybierz Właściwości z menu kontekstowego.

Simon Tewsi
źródło
Działa to w przypadku publikowania programu Visual Studio 2015 na platformie Azure.
Chris
2
Problem występuje, gdy potrzebujesz wykluczonych plików tylko dla określonych środowisk docelowych (konfiguracje kompilacji). To jest bolesne.
benmccallum
5

Myślę, że masz tutaj tylko dwie opcje:

  • Użyj funkcji „Wyklucz z projektu”. Nie jest to idealne rozwiązanie, ponieważ element projektu zostanie wykluczony z wszelkich zintegrowanych operacji kontroli źródła IDE. Musisz kliknąć przycisk „Pokaż wszystkie pliki” w oknie rozwiązania, jeśli chcesz wyświetlić pliki w Eksploratorze rozwiązań, ale wyświetla ono również pliki i foldery, które Cię nie interesują.
  • Użyj skryptu zdarzenia po kompilacji, aby usunąć wszystkie elementy projektu, których nie chcesz publikować (zakładając, że publikujesz w folderze lokalnym, a następnie przesyłasz na serwer).

Przeszedłem już przez to i nie mogłem wymyślić nic naprawdę eleganckiego.

Kev
źródło
2

W przypadku programu Visual Studio 2017, WebApp Publish , najpierw utwórz standardowy profil publikowania systemu plików. Przejdź do folderu App_Data \ PublishProfiles \ i edytuj plik [nazwa profilu] .pubxml.

Dodaj

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

pod tagiem <PropertyGroup> Możesz określić ten tag tylko raz, w przeciwnym razie przyjmie on tylko ostatnie wartości.

Przykład:

<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>

Upewnij się, że tag DeleteExistingFiles ma wartość False

Nico Dreyer
źródło
Nico, czy jesteś z lekarza ogólnego? Pracowałeś dla MCI?
Namphibian
1

Funkcja, której szukasz, istnieje, jeśli projekt został utworzony jako „aplikacja internetowa”. „Projekty” witryny sieci Web to po prostu zbiór plików, które są traktowane jako 1: 1, z tym, co jest wdrażane na serwerze sieci Web.

Pod względem funkcjonalności oba są takie same, jednak aplikacja internetowa kompiluje cały kod źródłowy do biblioteki DLL, zamiast kopiowania nagich plików kodu źródłowego na serwer sieciowy i kompilacji w razie potrzeby.

David
źródło
1

To tylko dodatek do innych pomocnych odpowiedzi tutaj i coś, co uznałem za przydatne ...

Używanie wpp.targets do wykluczonych plików i folderów

W przypadku wielu wdrożeń dla różnych środowisk warto mieć tylko jeden wspólny plik, w którym można ustawić wszystkie wykluczone pliki i foldery. Możesz to zrobić, tworząc *.wpp.targetsplik w katalogu głównym projektu, jak w przykładzie poniżej.

Aby uzyskać więcej informacji, zobacz ten przewodnik firmy Microsoft:

Instrukcje: edytowanie ustawień wdrażania w plikach profilu publikowania (.pubxml) i pliku .wpp.targets w projektach sieci Web programu Visual Studio

<?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
źródło
0

W programie Visual Studio 2017 (w moim przypadku 15.9.3) manipulacja plikiem .csproj działa naprawdę dobrze! Nie ma potrzeby modyfikowania pliku pubxml.

Następnie możesz skonstruować całkiem ładne ustawienia w pliku .csproj, używając warunku PropertyGroup, np .:

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

wyklucza folder „Samples” ze wszystkich wdrożeń z konfiguracjami zaczynającymi się od „Pub _” ...

Markus R.
źródło
Sprawdzam, czy to działa w przypadku programu Visual Studio 2017 bez stosowania właściwości „Warunek”.
Erdem KAYA
0

Jako współczesna odpowiedź, w programie Visual Studio 2017 z witryną .net core:

Możesz wykluczyć z publikowania w ten sposób w csproj, gdzie CopyToPublishDirectory nigdy nie jest.

  <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>

Bardziej szczegółowo omówiono to tutaj: 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>

Wydaje mi się, że wcześniejsze sugestie nie zadziałały, ponieważ Visual Studio używa teraz innego mechanizmu publikowania pod spodem, zakładam, że za pośrednictwem narzędzia CLI „dotnet Publishing” lub jego odpowiednika.

Alex KeySmith
źródło