domingo, 15 de marzo de 2015

Visual Studio. Agregar carpeta como vínculo.

En muchas ocasiones nos encontramos con la necesidad de compartir ficheros entre varios proyectos. Para ello Visual Studio nos da la posibilidad de añadir ficheros "como vínculos", de forma que podamos utilizar el fichero en un nuevo proyecto manteniéndolo en su ubicación original, sin necesidad de duplicar el fichero:


Sin embargo, ¿qué sucede cuando necesitamos compartir el contenido completo de una carpeta? Podemos querer compartir, por ejemplo, el contenido de una carpeta de imágenes para que todas nuestras aplicaciones utilicen los mismos juegos de iconos.



La única opción que disponemos desde Visual Studio es la de añadir los ficheros uno a uno "como vínculos". Pero, ¿y si la carpeta que queremos compartir tiene una estructura completa de subcarpetas? Deberíamos reproducir la estructura en nuestra aplicación e ir añadiendo en cada una de ellas los ficheros uno o a uno.

¿No existe la opción de incluir una carpeta completa como vínculo? Pues sí que existe. Aunque el interfaz de Visual Studio no nos ofrece esta opción (por lo que he podido ver tampoco está incluida en Visual Studio 2015), los archivos de proyecto si que contemplan esta posibilidad. Así que podemos incluir en nuestros proyectos carpetas "como vínculos" pero necesitaremos editar directamente nuestros archivos de proyecto (.vbproj, .csproj, etc)

Si abrimos el archivo de proyecto con nuestro editor de texto favorito podremos ver que se trata de un fichero XML con un elemento raíz Project. Dentro de este elemento Project encontramos una serie de elementos ItemGroup con entradas que hacen referencia al contenido de nuestra aplicación, con elementos como Reference (referencias a librerías externas), Compile (archivos de código), Content (archivos de contenido: imágenes, documentos, etc).


Para añadir nuestra carpeta "como vínculo" bastará con añadir una nueva entrada ItemGroup al proyecto:

<ItemGroup>
  <Content Include="..\MiProyectoOrigen\images\*.*">
    <Link>images\%(RecursiveDir)%(FileName)</Link>
  </Content>
</ItemGroup>



De esta forma conseguiremos incluir todos los archivos contenidos en la carpeta MiproyectoOrigen/images en una nueva carpeta images dentro del proyecto. También podemos filtrar los archivos a incluir a través del atributo Include. Si, por ejemplo, sólo queremos vincular los ficheros .jpg:

<ItemGroup>
  <Content Include="..\MiProyectoOrigen\images\*.jpg">
    <Link>images\%(RecursiveDir)%(FileName)</Link>
  </Content>
</ItemGroup>
Si queremos incluir también el contenido de toda la estructura de carpetas que existe debajo de la carpeta images:

<ItemGroup>
  <Content Include="..\MiProyectoOrigen\images\**\*.*">
    <Link>images\%(RecursiveDir)%(FileName)</Link>
  </Content>
</ItemGroup>
El patrón \**\*.* realiza la magia.

Si en lugar de incluir archivos de contenido (imágenes, css, documentos, etc.) queremos incluir archivos de código que deben ser compilados, reemplazaremos la etiqueta Content por Compile:
<ItemGroup>
  <Content Include="..\MiProyectoOrigen\LibreriaClases\**\*.*">
    <Link>LibreriaClases\%(RecursiveDir)%(FileName)</Link>
  </Content>
</ItemGroup>
Simplemente hay que tener en cuenta que los ficheros que se añadan a la carpeta origen no aparecerán automáticamente en nuestro proyecto. Será necesario que cerremos y volvamos a abrir el proyecto para que se actualice la lista de ficheros.

No hay comentarios:

Publicar un comentario