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.