¿Cómo se incluyen archivos adicionales utilizando paquetes de despliegue web VS2010?

Estoy probando el uso de la nueva funcionalidad de empaquetado web en visual studio 2010 y me encontré con una situación en la que uso un evento de preconstrucción para copiar los archivos .dll necesarios en mi carpeta bin de la que mi aplicación depende para las llamadas API. No se pueden incluir como referencia ya que no son DLL COM que se pueden usar con interoperabilidad.

Cuando construyo mi paquete de implementación, esos archivos se excluyen cuando elijo la opción para incluir solo los archivos necesarios para ejecutar la aplicación. ¿Hay alguna manera de configurar las configuraciones de implementación para incluir estos archivos? No he tenido suerte para encontrar una buena documentación sobre esto.

    Gran pregunta Acabo de publicar una entrada de blog muy detallada sobre esto en Web Deployment Tool (MSDeploy): Build Package, que incluye archivos extra o excluye archivos específicos .

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

    Incluyendo archivos extra

    Incluir archivos extra en el paquete es un poco más difícil, pero aún no hay bigee si te sientes cómodo con MSBuild, y si no estás leyendo esto. Para hacer esto, necesitamos conectarnos a la parte del proceso que recostack los archivos para el empaquetado. El objective que necesitamos extender se llama CopyAllFilesToSingleFolder. Este objective tiene una propiedad de dependencia, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, que podemos aprovechar e inyectar nuestro propio objective. Así que crearemos un objective llamado CustomCollectFiles e inyectaremos eso en el proceso. Logramos esto con lo siguiente (recuerde después de la statement de importación).

      CustomCollectFiles; $(CopyAllFilesToSingleFolderForPackageDependsOn);   CustomCollectFiles; $(CopyAllFilesToSingleFolderForMsdeployDependsOn);   

    Esto agregará nuestro objective al proceso, ahora tenemos que definir el objective en sí. Supongamos que tiene una carpeta llamada Extra Files que se encuentra 1 nivel por encima de su proyecto web. Desea incluir todos esos archivos. Aquí está el objective CustomCollectFiles y discutiremos después.

       <_customfiles Include="..\Extra Files\**\*">  Extra Files\%(RecursiveDir)%(Filename)%(Extension)    

    Aquí lo que hice fue crear el elemento _CustomFiles y en el atributo Include le dije que recogiera todos los archivos en esa carpeta y cualquier carpeta debajo de ella. Si por casualidad necesita excluir algo de esa lista, agregue un atributo Exclude a _CustomFiles .

    Luego utilizo este elemento para completar el elemento FilesForPackagingFromProject. Este es el elemento que MSDeploy realmente usa para agregar archivos extra. También tenga en cuenta que he declarado el valor DestinationRelativePath de metadatos. Esto determinará la ruta relativa que se colocará en el paquete. Usé la statement Extra Files% (RecursiveDir)% (Filename)% (Extension) aquí. Lo que está diciendo es colocarlo en la misma ubicación relativa en el paquete que en la carpeta Extra Files.

    Excluyendo archivos

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

      

    Por cierto, puede abrir el archivo de proyecto dentro de VS. Haga clic con el botón derecho en la selección del proyecto Descargar proyecto. A continuación, haga clic derecho en el proyecto descargado y seleccione Editar proyecto.

    Esta statement incluirá todos los objectives y tareas que necesitamos. La mayoría de nuestras personalizaciones deben realizarse después de esa importación, si no está seguro, ¡si lo hizo 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 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 statement de importación.

       Project   

    Al declarar poblar 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 especificarlo siempre.

    Una solución más simple es editar el archivo csproj para incluir el dll requerido en la carpeta bin y luego crear un objective beforebuild para copiar el elemento en la carpeta bin desde la carpeta común de la biblioteca donde almacenamos 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.

    Etiqueta utilizada para incluir archivos sin agregarlos a través de VS (que generalmente querrán agregarlos a su VCS)

     false 

    Este es el objective 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 mi

    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 biblioteca / carpeta de referencias, y luego en las propiedades configúrelo para copiarlo al resultado de la comstackción.

    Entonces la implementación de Sayed no funcionó para mí. Estoy usando VS2013 y utilizando el paquete de Web Deploy y necesitaba agregar algunas DLL de complemento de otra carpeta al contenedor del paquete de implementación. Así es como me las arreglé para que funcione (mucho más fácil):

    En la parte inferior de su archivo csproj, agregue:

           

    Otras menciones en el archivo csproj:

      pdbonly true bin\ TRACE prompt 4 true Package Default Web Site/MyWebsite ..\output\Service\Service\Service.Release.zip OnlyFilesToRunTheApp true false   

    Quería comentar para enfatizar el comentario de Emil Lerch arriba. Si ha instalado un SDK de Azure, busque una DependencyProperty diferente.

    Básicamente, puede que necesites 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 objectives.

    Aquí hay otro enlace si esto no funciona para usted y ha instalado un SDK de Azure: http://forums.iis.net/t/1190714.aspx

    Como una adición a la respuesta de Sayed, descubrí que una statement estática de elementos ExcludeFromPackageFiles dentro de mi proyecto no era suficiente. Necesitaba excluir ciertas DLL que solo estaban disponibles después de la comstackción (módulos Ninject específicos de Azure que no son necesarios cuando implemento en IIS).

    Así que intenté engancharme en la generación de mi lista ExcludeFromPackageFiles usando el truco de CopyAllFilesToSingleFolderForPackageDependsOn 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:

       $(ExcludeFilesFromPackageDependsOn); _ExcludeAzureDlls        _ExcludeAzureEnvironmentDlls    

    Espero que ayude a alguien …