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?
Respuestas:
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.
fuente
Encontré una solución para el problema utilizando el
ExcludeFilesFromDeployment
elemento dentro del archivo del proyecto. Se me ocurrió la idea de Web Deployment: Excluyendo archivos y carpetasEntonces, 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.
seleccione Elementos para implementar para que sean "Todos los archivos en esta carpeta del proyecto"
PropertyGroup
elemento asociado al ajuste de configuración, por ejemplo, "Liberar"Dentro del
PropertyGroup
elemento, 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>
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?
fuente
Seleccione sus archivos o carpetas y cambie la acción de compilación como contenido en la ventana de propiedades.
fuente
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:
fuente
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
fuente
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
CopyAllFilesToSingleFolderForPackageDependsOn
oCopyAllFilesToSingleFolderForMSDeployDependsOn
en elPropertyGroup
y 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
PropertyGroup
secció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
fuente