Gran pregunta Acabo de publicar una entrada de blog muy detallada sobre esto en la Herramienta de implementación web (MSDeploy): paquete de compilación que incluye archivos adicionales o 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 no es un patudo si te sientes cómodo con MSBuild, y si no lo estás, lee 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. Entonces crearemos un objetivo llamado CustomCollectFiles e inyectaremos eso en el proceso. Logramos esto con lo siguiente (recuerde después de la declaración de importación).
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</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. Desea incluir todos esos archivos. Aquí está el objetivo 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 él. Si por casualidad necesita excluir algo de esa lista, agregue un Exclude
atributo a _CustomFiles
.
Luego uso este elemento para llenar el elemento FilesForPackagingFromProject. Este es el elemento que MSDeploy realmente usa para agregar archivos adicionales. Observe también que he declarado el valor de metadatos DestinationRelativePath. Esto determinará la ruta relativa que se colocará en el paquete. Usé la declaración Archivos adicionales% (RecursiveDir)% (Nombre de archivo)% (Extensión) aquí. Lo que está diciendo es colocarlo en la misma ubicación relativa en el paquete que está debajo de la carpeta Archivos adicionales.
Excluyendo archivos
Si abre el archivo de proyecto de una aplicación web creada con VS 2010 en 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 realizarse después de esa importación, si no está seguro, ¡ponga después! Entonces, si tiene que excluir archivos, hay un nombre de elemento, ExcludeFromPackageFiles, que puede usarse para hacerlo. Por ejemplo, supongamos que tiene un archivo llamado Sample.Debug.xml que se incluye 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 completar este elemento, los archivos se excluirán automáticamente. Tenga en cuenta el uso de los FromTarget
metadatos aquí. No voy a entrar en eso aquí, pero debes saber especificar siempre eso.
Una solución más simple es editar el archivo csproj para incluir el dll requerido en la carpeta bin y luego crear un objetivo antes de construir para copiar el elemento en la carpeta bin desde la carpeta de biblioteca común donde almacenamos nuestros archivos dlls de terceros. Debido a que el elemento existe en el archivo de solución, msbuild / msdeploy lo implementa y no se necesita nada complicado.
La etiqueta solía incluir el archivo sin agregar a través de VS (que generalmente querrá agregarlo a su VCS)
Este es el objetivo BeforeBuild que funcionó para mí:
Editado para incluir la sugerencia de @ tuespetre para ocultar la entrada, eliminando así la desventaja anterior de una carpeta bin visible. No verificado por mí.
fuente
<Visible>false</Visible>
para ocultarlo del Explorador de soluciones.Al igual que @toxaq, pero una solución aún más simple es:
En el explorador de soluciones, agregue el archivo como un enlace a la carpeta de la biblioteca / referencias, y luego, en las propiedades, configúrelo para que se copie en la salida de la compilación.
fuente
Entonces la implementación de Sayed no funcionó para mí. Estoy usando VS2013 y estoy usando el paquete Web Deploy y necesitaba agregar algunas DLL de plugin de otra carpeta al contenedor del paquete de implementación. Así es como logré hacerlo funcionar (mucho más fácil):
En la parte inferior de su archivo csproj agregue:
Otros mencionables en el archivo csproj:
fuente
Quería comentar para enfatizar el comentario de Emil Lerch arriba. Si ha instalado un SDK de Azure, busque una propiedad de dependencia diferente.
Básicamente, es posible que deba usar "CopyAllFilesToSingleFolderForMsdeployDependsOn en lugar de" CopyAllFilesToSingleFolderForPackageDependsOn ". No soy realmente un tipo avanzado de MsBuild y perdí muchas horas tratando de determinar por qué no se llamaba a mis objetivos.
Aquí hay otro enlace si esto no funciona para usted y ha instalado un SDK de Azure: http://forums.iis.net/t/1190714.aspx
fuente
Como anexo a la respuesta de Sayed, descubrí que una declaración estática de elementos ExcludeFromPackageFiles dentro de mi proyecto no era suficiente. Necesitaba excluir ciertas DLL que solo estaban disponibles después de la compilación (módulos Ninject específicos de Azure que no son necesarios cuando implemento en IIS).
Así que intenté enganchar la generación de mi lista ExcludeFromPackageFiles usando el truco CopyAllFilesToSingleFolderForPackageDependsOn Sayed publicado anteriormente. Sin embargo, esto es demasiado tarde ya que el proceso de empaquetado ya eliminó los elementos ExcludeFromPackageFiles. Entonces, utilicé la misma técnica, pero un poco antes:
Espero que ayude a alguien ...
fuente
Además, es posible configurar el archivo como Contenido | Copia siempre
fuente