Excluir archivos del sitio web publicar en Visual Studio

79

¿Puedo excluir una carpeta o archivos cuando publico un sitio web en Visual Studio 2005? Tengo varios recursos que quiero tener a mano en el Explorador de soluciones, como archivos de configuración alternativos para varios entornos, pero realmente no quiero publicarlos en el servidor. ¿Hay alguna forma de excluirlos? Cuando utilizo otros tipos de proyectos, como un ensamblado .dll, puedo establecer la propiedad Build Action de un archivo en "Ninguno" y su propiedad Copiar en el directorio de salida en "No copiar". No encuentro configuraciones similares para archivos en un sitio web.

Si el IDE no ofrece esta función, ¿alguien tiene una buena técnica para manejar dichos archivos?

Jim Snyder
fuente
3
Aquí puede encontrar una solución muy simple: stackoverflow.com/questions/1288858/…
Dmitriy Melnik

Respuestas:

32

Si puede identificar los archivos en función de la extensión, puede configurarlo utilizando la etiqueta buildproviders en web.config . Agregue la extensión y asignela a ForceCopyBuildProvider. Por ejemplo, para configurar archivos .xml para que se copien con una acción de publicación, debe hacer lo siguiente:

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

Para evitar que se copie un archivo determinado, haría lo mismo pero usaría System.Web.Compilation.IgnoreFileBuildProvider como tipo.

Chris Hynes
fuente
Super guay. No tuve suerte con el ExcludeFromPackageFiles recomendado en el archivo wpp.targets. Este último es bastante inútil ya que no parece admitir comodines con carpetas de más de un nivel de profundidad. Gracias
DvS
127

Excluya archivos y carpetas agregando elementos ExcludeFilesFromDeploymenty ExcludeFoldersFromDeploymental archivo de su proyecto (.csproj, .vbproj, etc.). Deberá editar el archivo en un editor de texto o en Visual Studio descargando el proyecto y luego editándolo.

Agregue las etiquetas en cualquier lugar dentro del apropiado PropertyGroup(depuración, lanzamiento, etc.) como se muestra a continuación:

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

Se admiten comodines.

Para explicar el ejemplo anterior:

  • El primero ExcludeFilesFromDeploymentexcluye File1.aspx(en la raíz del proyecto) y Folder2\File2.aspx( Folder2está en la raíz del proyecto)
  • El segundo ExcludeFilesFromDeploymentexcluye todos los archivos dentro de cualquier carpeta nombrada .svny cualquiera de sus subcarpetas
  • Las ExcludeFoldersFromDeploymentcarpetas excluidas nombradas Folder1(en la raíz del proyecto) y Folder2\Folder2a( Folder2está en la raíz del proyecto)

Para obtener más información, consulte la publicación del blog de MSDN Implementación web: exclusión de archivos y carpetas a través del archivo de proyecto de la aplicación web

Keith
fuente
1
¿Hay alguna forma de usar comodines con esto?
roydukkey
4
Esto es mucho mejor que la respuesta aceptada para mí, ya que quiero excluir el archivo Web.config durante la publicación.
Michael Eakins
6
En proyectos de tipo "Sitio web", este fragmento de código se agrega a los archivos * .pubxml ubicados en ~ / App_Data / PublishProfiles /.
laylarenee
4
En una aplicación web, puede agregar estos elementos al PropertyGroup de su perfil de publicación @ ~ \ Properties \ PublishProfiles
ExecutionOrder
6
¿Hay alguna forma de hacer esto a través de la interfaz de usuario en lugar de editar el archivo del proyecto directamente?
Kurren
35

Sorprendentemente, la respuesta para Visual Studio 2012 no está aquí:

  • La respuesta con una marca de verificación verde no es la respuesta.

  • La respuesta "mejorada" más alta hace referencia a un artículo de 2010 y dice que tiene que editar su archivo de proyecto csproj que ahora es incorrecto. Agregué el elemento XML ExcludeFoldersFromDeployment a mi archivo csproj de Visual Studio 2012 y no hizo nada, el elemento se consideró no válido, esto se debe a que ExcludeFoldersFromDeployment se ha movido al archivo .pubxml que parece.

Para aplicaciones web y sitios web , edite el archivo .pubxml.

Puede seguir mi respuesta o probar esta guía que encontré más tarde: 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

Sí, puede hacer esto no solo para proyectos de sitios web, sino también para sitios web. Pasé mucho tiempo en Internet buscando esta elusiva capacidad de exclusión con un sitio web de Visual Studio (NO un proyecto de sitio web) y previamente había concluido que no era posible, pero parece que lo es:

En su archivo [mypublishwebsitename] .pubxml, que se encuentra en ~ / Properties / PublishProfiles para proyectos de aplicaciones web y ~ / App_Data / PublishProfiles para sitios web, simplemente agregue:

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

como hijos al <PropertyGroup>elemento principal en su archivo .pubxml. No es necesario agregar un nuevo elemento, a menos que esté ingresando un tipo de compilación específico, como liberación o depuración.

¡¡¡PERO ESPERA!!!

Si está eliminando archivos de su destino / servidor de destino con la siguiente configuración en su configuración de Publicación:

ingrese la descripción de la imagen aquí

Luego, el proceso de publicación web eliminará en su servidor de origen / destino todo lo excluido, como un elemento que haya delineado en su <ExcludeFoldersFromDeployment>y <ExcludeFilesFromDeployment>!

MsDeploy Skip Rules al rescate:

Primero, Web Publish usa algo diferente a MSBuild para publicar (llamado Task IO o algo así) pero tiene un error y no reconoce las reglas de omisión, por lo que debe agregar a su .pubxml:

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

Me mantendría <WebPublishMethod>por su cuenta<PropertyGroup> , pensaría que podría tener solo un <PropertyGroup>elemento en su .pubxml pero no se llamaron mis reglas de omisión hasta que me mudé <WebPublishMethod>a su propio <PropertyGroup>elemento. Sí, una locura, pero el hecho de que tenga que hacer todo esto para que Web Publish excluya y no elimine una carpeta / archivo de su servidor es una locura.

Ahora mis declaraciones actuales de SkipRules, ExcludeFolders y ExcludeFiles en mi .pubxml:

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

Y ahora, las reglas <Target>de <Project>omisión ( son un elemento secundario de en su .pubxml): ( es posible que pueda dejar <SkipAction>vacío para omitir todas las acciones, pero no lo probé y no estoy seguro.

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

Y, por favor, no olvides escapar de la .regla de salto en una ruta de archivo con una barra invertida.

Brian Ogden
fuente
11

Luché con el mismo problema y finalmente apreté el gatillo para convertir el sitio web en una aplicación web. Una vez que hice esto, obtuve todos los beneficios del IDE, como la acción de compilación, y se compiló más rápido para arrancar (no más sitio web de validación ...).

Paso 1: convierta su 'sitio web' en una 'aplicación web'. Para convertirlo, acabo de crear una nueva "aplicación web", borré todos los archivos que creó automáticamente y copié y pegué mi sitio web. Esto funcionó bien. Tenga en cuenta que los archivos de informe deberán tener su Acción de compilación establecida en "Contenido" en lugar de "ninguno".

Paso 2: Ahora puede establecer la propiedad "Acción de compilación" de cualquier archivo.

Espero que esto ayude.

BlackjacketMack
fuente
7

En Visual Studio 2013, encontré que la respuesta de Keith, agregar el ExcludeFoldersFromDeploymentelemento al archivo del proyecto, no funcionó (no había leído la respuesta de Brian Ogden que dice esto). Sin embargo, descubrí que podía excluir un archivo de texto al publicar en Visual Studio 2013 simplemente configurando las siguientes propiedades en el archivo de texto:

1) Acción de construcción: ninguna

2) Copiar al directorio de salida: no copiar

Inicialmente intenté configurar la propiedad Copiar en el directorio de salida por sí misma, pero eso no funcionó cuando la Acción de compilación se estableció en el valor predeterminado, Contenido. Cuando configuré la Acción de compilación en Ninguna, el archivo de texto ya no se copió en la carpeta de destino cuando publiqué.

Para ver estas propiedades en la GUI de Visual Studio, en el Explorador de soluciones, haga clic con el botón derecho en el archivo que desea excluir y seleccione Propiedades en el menú contextual.

Simon Tewsi
fuente
Esto funciona en la publicación de Visual Studio 2015 en Azure.
Chris
2
El problema es cuando necesita archivos excluidos solo para ciertos entornos de destino (configuraciones de compilación). Esto es doloroso.
benmccallum
5

Creo que solo tienes dos opciones aquí:

  • Utilice la función 'Excluir del proyecto'. Esto no es ideal porque el elemento del proyecto se excluirá de cualquier operación de control de fuente IDE integrada. Debería hacer clic en el botón 'Mostrar todos los archivos' en la ventana de la solución si necesita ver los archivos en el Explorador de soluciones, pero eso también muestra los archivos y carpetas que no le interesan.
  • Use un script de evento posterior a la compilación para eliminar los elementos del proyecto que no desea que se publiquen (asumiendo que está publicando en una carpeta local y luego subiendo al servidor).

He pasado por esto antes y no pude encontrar nada realmente elegante.

Kev
fuente
2

Para Visual Studio 2017, publicación de aplicaciones web , primero cree un perfil de publicación de sistema de archivos estándar. Vaya a la carpeta App_Data \ PublishProfiles \ y edite el archivo [nombre de perfil] .pubxml.

Añadir

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

debajo de la etiqueta<PropertyGroup> Solo puede especificar esta etiqueta una vez, de lo contrario, solo tomará los últimos valores.

Ejemplo:

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

Asegúrese de que la etiqueta DeleteExistingFiles esté establecida en False

Nico Dreyer
fuente
Nico eres de GP? ¿Trabajaste para MCI?
Namphibian
1

La característica que está buscando existe si su proyecto se crea como una "Aplicación web". Sitio web "proyectos" de son solo una colección de archivos que se consideran 1: 1 con lo que se implementa en un servidor web.

En términos de funcionalidad, ambos son iguales, sin embargo, una aplicación web compila todo el código fuente en una DLL, en lugar de que los archivos de código fuente desnudos se copien en el servidor web y se compilen según sea necesario.

David
fuente
0

En Visual Studio 2017 (15.9.3 en mi caso), ¡la manipulación del archivo .csproj funciona bien! No es necesario modificar el pubxml.

Luego puede construir configuraciones bastante agradables en el archivo .csproj usando la condición PropertyGroup, por ejemplo:

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

excluye la carpeta "Samples" de todas las implementaciones con configuraciones que comienzan con "Pub _" ...

Markus R.
fuente
Verifico que esto funciona para Visual Studio 2017 sin aplicar la propiedad "Condición".
Erdem KAYA
0

Como respuesta contemporánea, en Visual Studio 2017 con un sitio principal .net:

Puede excluir de la publicación como tal en el csproj, donde CopyToPublishDirectory nunca es.

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

Esto se analiza con más detalle aquí: 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>

Las sugerencias anteriores no funcionaron para mí, supongo que porque Visual Studio ahora está usando un mecanismo de publicación diferente debajo, supongo a través de la herramienta cli "dotnet publish" o equivalente debajo.

Alex KeySmith
fuente
0

Esto es solo un anexo a las otras respuestas útiles aquí y algo que he encontrado útil ...

Uso de wpp.targets para excluir archivos y carpetas

Cuando tiene varias implementaciones para diferentes entornos, es útil tener un solo archivo común donde puede configurar todos los archivos y carpetas excluidos. Puede hacer esto creando un *.wpp.targetsarchivo en la raíz del proyecto como el siguiente ejemplo.

Para obtener más información, consulte esta guía de Microsoft:

Cómo: editar la configuración de implementación en archivos de perfil de publicación (.pubxml) y el archivo .wpp.targets en proyectos web de 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
fuente