¿Cómo hacer que la funcionalidad 'Publicar' de Visual Studio incluya archivos del evento posterior a la compilación?

90

Actualmente estoy intentando usar Visual Studio 2010 'Publicar' y la funcionalidad MSDeploy para manejar mis necesidades de implementación web, pero me he encontrado con un obstáculo con respecto a la personalización del paquete según mi configuración de compilación.

Desarrollo en un entorno de 32 bits pero necesito crear un paquete de lanzamiento para un entorno de 64 bits, por lo que en la configuración de 'Lanzamiento' tengo un evento de compilación posterior que copia la versión de 64 bits de un dll de terceros en el directorio bin sobrescribiendo la versión de 32 bits . Cuando uso la funcionalidad 'Publicar', aunque se está copiando el dll de 64 bits correcto en el directorio bin, no se incluye en el paquete.

¿Hay alguna manera de hacer que 'Publicar' incluya archivos que se han copiado en el directorio bin durante un evento posterior a la compilación?

Brodie
fuente
1
Si usa un evento previo a la compilación en su lugar, esto parece funcionar como le gustaría (Visual Studio 2013, plantilla de proyecto ASP.NET).
bzlm
Parece que han eliminado el comportamiento predefinido mencionado en el comentario anterior en Visual Studio 2015 y versiones posteriores.
justdan23

Respuestas:

92

Respondí una pregunta similar pero diferente en ¿Cómo se incluyen archivos adicionales con los paquetes de implementación web VS2010? .

En su escenario en el que está utilizando el evento posterior a la compilación, recomendaría eliminar el evento posterior a la compilación e implementar sus acciones utilizando sus propios objetivos de MSBuild en lugar del evento posterior a la compilación. A continuación encontrará el texto de la otra respuesta.


De: ¿Cómo se incluyen archivos adicionales mediante los paquetes de implementación web VS2010?


Gran pregunta. Acabo de publicar una entrada de blog muy detallada sobre esto en Web Deployment Tool (MSDeploy): paquete de compilación que incluye archivos adicionales o que excluye archivos específicos .

Aquí está la sinopsis. Después de incluir archivos, también muestro cómo excluir archivos.

Incluyendo archivos adicionales

Incluir archivos adicionales en el paquete es un poco más difícil, pero aún así no es complicado si se siente cómodo con MSBuild, y si no lo está, lea esto. Para hacer esto, necesitamos conectarnos a la parte del proceso que recopila los archivos para empaquetarlos. El objetivo que necesitamos extender se llama CopyAllFilesToSingleFolder. Este objetivo tiene una propiedad de dependencia, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, que podemos aprovechar e inyectar nuestro propio objetivo. Así que crearemos un destino llamado CustomCollectFiles y lo inyectaremos en el proceso. Logramos esto con lo siguiente (recuerde después de la declaración de importación).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

Esto agregará nuestro objetivo al proceso, ahora necesitamos definir el objetivo en sí. Supongamos que tiene una carpeta llamada Archivos adicionales que se encuentra 1 nivel por encima de su proyecto web. Quieres incluir todos esos archivos. Aquí está el destino CustomCollectFiles y discutimos después de eso.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Aquí lo que hice fue crear el elemento _CustomFiles y en el atributo Incluir le dije que recogiera todos los archivos en esa carpeta y cualquier carpeta debajo de ella. Luego utilizo este elemento para completar el elemento FilesForPackagingFromProject. Este es el elemento que MSDeploy realmente usa para agregar archivos adicionales. También observe que declaré el valor DestinationRelativePath de los metadatos. Esto determinará la ruta relativa a la que se colocará en el paquete. Usé la instrucción Archivos adicionales% (RecursiveDir)% (Nombre de archivo)% (Extensión) aquí. Lo que eso dice es colocarlo en la misma ubicación relativa en el paquete que en la carpeta Archivos adicionales.

Excluyendo archivos

Si abre el archivo de proyecto de una aplicación web creada con VS 2010 hacia la parte inferior, encontrará una línea con.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

Por cierto, puede abrir el archivo del proyecto dentro de VS. Haga clic derecho en el proyecto, seleccione Descargar proyecto. Luego haga clic derecho en el proyecto descargado y seleccione Editar proyecto.

Esta declaración incluirá todos los objetivos y tareas que necesitamos. La mayoría de nuestras personalizaciones deben ser posteriores a esa importación, si no está seguro, ¡póngalas después! Entonces, si tiene archivos para excluir, hay un nombre de elemento, ExcludeFromPackageFiles, que se puede usar para hacerlo. Por ejemplo, digamos que tiene un archivo llamado Sample.Debug.js que está incluido en su aplicación web, pero desea que ese archivo se excluya de los paquetes creados. Puede colocar el fragmento a continuación después de esa declaración de importación.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

Al declarar rellenar este elemento, los archivos se excluirán automáticamente. Tenga en cuenta el uso de los metadatos FromTarget aquí. No entraré en eso aquí, pero debes saber que siempre debes especificarlo.

Sayed Ibrahim Hashimi
fuente
8
@ Dijo, esto no parece funcionar para VS2012, ¿sabe cómo se puede actualizar para este escenario? cambiar a v11.0 no funciona. TIA.
Simon Francesco
2
Literalmente no hay documentación sobre este tema. La documentación de Microsoft hace referencia a sus blogs.
Matthew James Davis
2
@Daniel Si solo necesita archivos específicos y no una carpeta, simplemente cambie _CustomFiles para incluir esos archivos específicos en lugar de agregarlos de forma recursiva con ***. Entonces, algo como <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Algo similar a eso.
bwerks
3
@SimonFrancesco También experimenté esto, y el cambio necesario parece haber sido extender <CopyAllFilesToSingleFolderForMsdeployDependsOn> en lugar de <CopyAllFilesToSingleFolderForPackageDependsOn> como está escrito en la respuesta anterior.
bwerks
13

Encontré una solución para el problema utilizando el ExcludeFilesFromDeploymentelemento dentro del archivo del proyecto. Se me ocurrió la idea de Web Deployment: Excluyendo archivos y carpetas

Entonces, si necesita empaquetar los archivos del proyecto tal como existen en el directorio de su proyecto después de una compilación exitosa y los pasos de compilación posteriores asociados, haga lo siguiente.

  1. Edite la configuración del proyecto "Empaquetar / Publicar web" y
    seleccione Elementos para implementar para que sean "Todos los archivos en esta carpeta del proyecto"
  2. Descargar el proyecto
  3. Haga clic derecho en el proyecto descargado y seleccione editar la configuración del proyecto
  4. Localice el PropertyGroupelemento asociado al ajuste de configuración, por ejemplo, "Liberar"
  5. Dentro del PropertyGroupelemento, agregue los siguientes elementos y excluya los archivos y carpetas que no desea en el paquete

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. Guarda y recarga tu proyecto

Esto resuelve mi problema por el momento, pero si hay una solución mejor, hágamelo saber, ya que esto no es ideal debido a la piratería involucrada, pero, de nuevo, ¿quizás este es un escenario de implementación poco común?

Brodie
fuente
6

Seleccione sus archivos o carpetas y cambie la acción de compilación como contenido en la ventana de propiedades.

Gomes
fuente
1
Correcto, pero además tienes que seleccionar "Copiar si es más nuevo" o "Copiar siempre", porque de lo contrario la acción predeterminada es "No copiar", incluso si se selecciona "Contenido".
Matt
1
de acuerdo con Matt para un paso adicional
Gomes
7
No existe acción de compilación para carpetas (VS2013)
Cristian E.
copytooutputdirectory = Copiar siempre
Gomes
Funcionó incluso sin Copiar siempre.
Tengiz
3

Sé que es una vieja pregunta, pero ninguna de estas me funcionó.

En 2017 VS, simplemente hice clic con el botón derecho en la carpeta adicional que se publicará y seleccioné publicar, funcionó.

Ejemplo:

ingrese la descripción de la imagen aquí

usuario2695433
fuente
Aunque es un pequeño paso adicional, es muy simple.
Ciaran Gallagher
0

Agregar la carpeta bin (y su contenido) al proyecto hizo que los archivos se copiaran en el directorio de salida de publicación.

Para mí, mi problema era que necesitaba colocar un archivo de licencia de software propietario en la carpeta bin /, pero no quería copiarlo manualmente en cada implementación.

Esto estaba usando Visual Studio 2015 Professional

James Wierzba
fuente
0

Sé que esta es una conversación antigua, pero me encontré con ella mientras intentaba hacer lo mismo y pensé que sería útil agregar lo que encontré aquí.

Casi todos los artículos sobre la inclusión de archivos adicionales en su publicación utilizan este método para agregar los elementos CopyAllFilesToSingleFolderForPackageDependsOno CopyAllFilesToSingleFolderForMSDeployDependsOnen el PropertyGroupy todos son iguales, como "Agregué esto al final del archivo ..."

Esto es lo que hice y pasé una tarde tratando de averiguar por qué no pasaba nada hasta que me di cuenta de que ya había una PropertyGroupsección en la parte superior del archivo. Cuando pongo miCopyAllFilesToSingleFolderForPackageDependsOn en esa sección funcionó bien.

Espero que esto le ahorre tiempo a alguien algún día

john.gleeson
fuente