web-dev-qa-db-fra.com

Exclure des fichiers de la publication de sites Web dans Visual Studio

Puis-je exclure un dossier ou des fichiers lorsque je publie un site Web dans Visual Studio 2005? Je souhaite garder diverses ressources dans l'Explorateur de solutions, telles que des fichiers de configuration alternatifs pour différents environnements, mais je ne souhaite pas vraiment les publier sur le serveur. Y a-t-il un moyen de les exclure? Lorsque vous utilisez d'autres types de projet, tels qu'un assembly .dll, je peux définir la propriété d'action de génération d'un fichier sur "Aucune" et sa propriété Copier dans le répertoire de sortie sur "Ne pas copier". Je ne trouve pas de paramètres similaires pour les fichiers d'un site Web.

Si IDE n'offre pas cette fonctionnalité, est-ce que quelqu'un a une bonne technique pour gérer de tels fichiers?

72
Jim Snyder

Si vous pouvez identifier les fichiers en fonction de leur extension, vous pouvez le configurer à l’aide de la balise buildproviders dans le fichier web.config . Ajoutez l'extension et associez-la à ForceCopyBuildProvider. Par exemple, pour configurer les fichiers .xml à copier avec une action de publication, procédez comme suit:

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

Pour garder un fichier donné en cours de copie, vous feriez la même chose, mais utilisez System.Web.Compilation.IgnoreFileBuildProvider comme type.

28
Chris Hynes

Excluez les dossiers et les fichiers en ajoutant des éléments ExcludeFilesFromDeployment et ExcludeFoldersFromDeployment à votre fichier de projet (.csproj, .vbproj, etc.). Ajoutez-les n'importe où dans la PropertyGroup appropriée (Debug, Release, etc.) comme indiqué ci-dessous:

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

Les caractères génériques sont pris en charge.

Pour expliquer l'exemple ci-dessus:

  • Le 1st ExcludeFilesFromDeployment exclut File1.aspx (à la racine du projet) et Folder2\File2.aspx (Folder2 se trouve à la racine du projet).
  • Le 2nd ExcludeFilesFromDeployment exclut tous les fichiers d'un dossier nommé .svn et de ses sous-dossiers.
  • ExcludeFoldersFromDeployment exclut les dossiers nommés Folder1 (à la racine du projet) et Folder2\Folder2a (Folder2 se trouve à la racine du projet).

Pour plus d’informations, voir Déploiement Web: Exclusion de fichiers et de dossiers via le fichier de projet de l’application Web

110
Keith

Étonnamment, la réponse pour Visual Studio 2012 n'est pas là:

  • La réponse avec une coche verte n'est pas la réponse.

  • La réponse la plus élevée "up" fait référence à un article de 2010 et indique que vous devez modifier votre fichier de projet csproj, qui est maintenant incorrect. J'ai ajouté l'élément XML ExcludeFoldersFromDeployment à mon fichier csproj Visual Studio 2012 et il n'a rien fait, l'élément a été considéré comme non valide, car ExcludeFoldersFromDeployment a été déplacé vers le fichier .pubxml auquel il ressemble.

Pour les applications Web et les sites Web, vous modifiez le fichier .pubxml! 

Vous pouvez suivre ma réponse ou essayer le guide que j'ai trouvé plus tard: 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

Oui, vous pouvez le faire non seulement pour les projets de sites Web, mais également pour les sites Web. J'ai passé beaucoup de temps sur Internet à chercher cette capacité d'exclusion évasive avec un site Web Visual Studio (PAS le projet de site Web) et j'avais déjà conclu que cela n'était pas possible, mais il semble que ce soit le cas:

Dans votre fichier .pubxml [mypublishwebsitename], qui se trouve dans ~/Propriétés/PublishProfiles pour les projets d'application Web et ~/App_Data/PublishProfiles pour les sites Web, ajoutez simplement:

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

en tant qu’enfants à l’élément principal <PropertyGroup> de votre fichier .pubxml. Il n'est pas nécessaire d'ajouter un nouvel élément, sauf si vous saisissez un type de construction spécifique, comme release ou debug.

MAIS ATTENDEZ!!!

Si vous supprimez des fichiers de votre serveur cible/cible avec le paramètre suivant dans votre configuration de publication:

enter image description here

Ensuite, le processus de publication Web supprimera sur votre serveur source/cible tout élément exclu, tel qu'un élément que vous avez défini dans vos <ExcludeFoldersFromDeployment> et <ExcludeFilesFromDeployment>

MsDeploy Skip Rules à la rescousse:

Tout d'abord, Web Publish utilise quelque chose d'autre que MSBuild pour la publication (appelé Task IO ou quelque chose du genre), mais il a un bogue et ne reconnaît pas les règles de saut. Vous devez donc ajouter à votre fichier .pubxml:

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

Je garderais <WebPublishMethod> dans son propre <PropertyGroup>, vous pourriez penser que vous ne pouvez avoir qu'un élément <PropertyGroup> dans votre .pubxml, mais mes règles de saut ne sont pas appelées tant que je n'ai pas déplacé <WebPublishMethod> dans son propre élément <PropertyGroup>. fait, vous devez faire tout cela pour que Web Publish exclue et qu’il ne supprime pas non plus un dossier/fichier sur votre serveur, c’est fou.

Maintenant, mes déclarations SkipRules, ExcludeFolders et ExcludeFiles dans mon fichier .pubxml:

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

Et maintenant une des règles de saut (<Target> est un enfant de <Project> dans votre fichier .pubxml): (Vous pourrez peut-être laisser <SkipAction> vide à Ignorer pour toutes les actions, mais je n’ai pas testé cela et je ne suis pas sûr.

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

Et s'il vous plait, n'oubliez pas d'échapper au . dans une règle filePath Skip avec une barre oblique inverse.

31
Brian Ogden

J'ai eu du mal à résoudre le même problème et j'ai finalement réussi à convertir le site Web en application Web. Une fois que j'ai fait cela, j'ai eu tous les avantages IDE tels que l'action de construction, et la compilation s'est accélérée pour démarrer (plus de site Web de validation ...).

Étape 1: Convertissez votre "site Web" en une "application Web". Pour le convertir, je viens de créer une nouvelle "application Web", de supprimer tous les fichiers créés automatiquement et de copier/coller mon site Web. Cela a bien fonctionné. Notez que l'action de génération des fichiers de rapport doit être définie sur "Contenu" au lieu de "aucune".

Étape 2: Maintenant, vous pouvez définir n’importe quel fichier propriété "Action de construction".

J'espère que cela t'aides.

11
BlackjacketMack

Dans Visual Studio 2013, la réponse de Keith, en ajoutant l'élément ExcludeFoldersFromDeployment au fichier de projet, ne fonctionnait pas (je n'avais pas lu la réponse de Brian Ogden dans laquelle il était indiqué). Cependant, j'ai découvert que je pouvais exclure un fichier texte lors de la publication dans Visual Studio 2013 en définissant simplement les propriétés suivantes sur le fichier texte lui-même:

1) Action de construction: Aucune

2) Copier dans le répertoire de sortie: ne pas copier

Au départ, j'ai essayé de définir la propriété Copier dans le répertoire de sortie par elle-même, mais cela ne fonctionnait pas lorsque l'action de génération était définie sur la valeur par défaut, Contenu. Lorsque j'ai ensuite défini l'action de génération sur Aucune, le fichier texte n'a plus été copié dans le dossier de destination lors de la publication.

Pour afficher ces propriétés dans l'interface graphique de Visual Studio, dans l'Explorateur de solutions, cliquez avec le bouton droit de la souris sur le fichier à exclure et sélectionnez Propriétés dans le menu contextuel.

6
Simon Tewsi

Je pense que vous avez seulement deux options ici:

  • Utilisez la fonctionnalité "Exclure du projet" Ce n’est pas idéal, car l’élément de projet .__ sera exclu de De toute opération intégrée de contrôle de source IDE . Vous devrez cliquer sur le bouton 'Afficher tout ' Du Fenêtre de la solution Si vous avez besoin de voir les fichiers dans Solution Explorer, mais cela. Également Indique les fichiers et les dossiers qui ne vous intéressent pas
  • Utilisez un script d'événement post-build pour supprimer tous les éléments de projet que vous ne voulez pas publier (en supposant que vous publiez dans un dossier local, puis que vous les téléchargiez sur le serveur).

J'ai déjà vécu cela auparavant et je ne pouvais rien trouver de vraiment élégant.

5
Kev

La fonctionnalité que vous recherchez existe si votre projet est créé en tant qu '"application Web". Web Site "projets" sont simplement une collection de fichiers qui sont considérés comme 1: 1 avec ce qui est déployé sur un serveur Web.

En termes de fonctionnalités, les deux sont identiques, mais une application Web compile tout le code source en une DLL, au lieu de copier les fichiers de code source nus sur le serveur Web et de les compiler selon les besoins.

1
David

Pour Visual Studio 2017, WebApp Publish , créez d'abord un profil de publication du système de fichiers standard. Accédez au dossier App_Data\PublishProfiles\et modifiez le fichier [profilename] .pubxml.

Ajouter 

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

sous la balise<PropertyGroup>Vous ne pouvez spécifier cette balise qu'une seule fois, sinon elle ne prendra que les valeurs de celle-ci.

Exemple:

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

Assurez-vous que la balise DeleteExistingFiles est définie sur False

1
Nico Dreyer

Dans Visual Studio 2017 (15.9.3 dans mon cas), la manipulation du fichier .csproj fonctionne parfaitement! Pas besoin de modifier le pubxml.

Vous pouvez ensuite construire de jolis paramètres Nice dans le fichier .csproj à l'aide de la condition PropertyGroup, par exemple:

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

exclut le dossier "Samples" de tous les déploiements avec des configurations commençant par "Pub _" ...

0
Markus R.

En guise de réponse contemporaine, dans Visual Studio 2017 avec un site principal .net:

Vous pouvez exclure de la publication comme dans csproj, où CopyToPublishDirectory n'est jamais.

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

Ceci est discuté plus en détail ici: 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>

Les suggestions précédentes ne fonctionnaient pas pour moi, je suppose, car Visual Studio utilise maintenant un mécanisme de publication différent en dessous, je suppose par l’intermédiaire de l’outil de cli «dotnet publish» ou l’équivalent en dessous. 

0
Alex KeySmith