"Agregar como enlace" para carpetas en proyectos de Visual Studio

128

En Visual Studio, podemos "Agregar como enlace" para agregar un enlace a un archivo en otro proyecto en la solución.

¿Hay alguna forma de hacer esto para carpetas completas, de modo que una carpeta completa en el proyecto A sea visible en el proyecto B, sin la necesidad de vincular manualmente a nuevos elementos en esa carpeta?

kpozin
fuente

Respuestas:

142

Como se indica en este blog , es posible.

<ItemGroup>
    <Compile Include="any_abs_or_rel_path\**\*.*">
        <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    </Compile>
</ItemGroup>

Pero tenga en cuenta que los archivos no se copiarán.

mes.
fuente
18
+1. También puede usar <Content ...>y agregar <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>para hacer que Visual Studio copie los recursos en la compilación.
Markus Jarderot
8
Intenta usar: en <None>...</None>lugar de <Compile>...</Compile>. Pero creo que copiará esos archivos de todos modos. Incluso VisualStudio hace esto con archivos vinculados.
mes
44
@mes. su respuesta agrega enlaces a todos los archivos en la raíz del proyecto, a veces es inconveniente. % (RecursiveDir) debería cambiarse a algún nombre de carpeta de enlace: por ejemplo, para vincular la carpeta de origen del proyecto wp7 'MyMainProject' en otro proyecto en esta solución: <ItemGroup> <Compile Include = ".. \ .. \ MyMainProject \ MyMainProject \ engine *. * "> <Link> engine \% (FileName) </Link> </Compile> </ItemGroup>
Tertium
24
Tuve que usar <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>para evitar que soltara las extensiones de los nombres de archivo.
Joe Daley
2
Para recursos de icono Png: <EmbeddedResource Include = ".. \ .. \ Icons \ 16 * .png">
ChrisB
126

En VS2012 y versiones posteriores, puede arrastrar una carpeta a otro proyecto con la tecla alt presionada. Es lo mismo que agregar cada archivo como enlace manualmente pero más rápido.

upd : considere usar Proyectos compartidos si está usando VS2013 actualización 2 (con el Administrador de referencia de proyectos compartidos ) o VS2015.

mt_serg
fuente
1
En VS2010, hacer esto copiará archivos y directorios en lugar de agregarlos como enlaces, creando duplicados no deseados.
Tom
3
Nota: la carpeta debe arrastrarse desde Windows Explorer (no otra instancia de Visual Studio). Además, debe ser un arrastre con el botón izquierdo, no un arrastre con el botón derecho. Funciona muy bien en VS2012.
davidpricedev
11
Creo que solo crea enlaces a todos los archivos en la carpeta de fuentes, no un enlace a la carpeta en sí. Eso significa que si agrega un archivo a la carpeta de origen, no se vinculará automáticamente.
Johnny5
1
@MauryMarkowitz, debe arrastrar una carpeta desde el proyecto VS, no desde el explorador de Windows u otra cosa.
mt_serg
1
@MauryMarkowitz, solución única, dos proyectos. Arrastre la Carpeta1 del Proyecto1 al Proyecto2 con la tecla alt presionada. Cada archivo de Project1 / Folder1 se agregará a Project2 / Folder1 como enlace.
mt_serg
37

Una adición a la respuesta de mo. y el comentario de Marcus, si está vinculando elementos de contenido, deberá incluir la extensión del archivo:

<ItemGroup>
  <Compile Include="any_abs_or_rel_path\**\*.*">
    <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Compile>
</ItemGroup>
Chad
fuente
¿Qué es esto <Compile ...en esto? En mi caso, necesito referir .tsarchivos a mi nuevo proyecto. cómo está hecho. ¡Gracias!
Rahmathullah M
23

Con respecto a la parte de la consulta original para que aparezca una carpeta vinculada en el IDE, es posible lograr esto, por lo que hay una carpeta en el explorador de soluciones con todos los archivos vinculados dentro, en lugar de todos los archivos que aparecen en la raíz de la solución. Para lograr esto, incluya la adición:

  <ItemGroup>
    <Compile Include="..\anypath\**\*.*">
      <Link>MyData\A\%(RecursiveDir)%(FileName)%(Extension)</Link>
    </Compile>
  </ItemGroup>

Esto incluirá todos los archivos del directorio vinculado en una nueva carpeta en el explorador de soluciones llamada MyData. La 'A' en el código anterior se puede llamar de cualquier manera, pero debe estar allí para que aparezca la carpeta.

Adán
fuente
parece hacer el truco, pero no pliega los archivos de Formulario en uno, y da errores para sus archivos .resx (estoy usando VB). Gracias de cualquier manera.
Ivan Ferrer Villa
1
@IvanFerrerVilla, sí, tengo algunos problemas que he notado, pero en su mayor parte solo es bueno para el aspecto.
Adam
3
Con Visual Studio 2015, esto funcionó para mí incluso sin la `A`.
Martin
7

Si desea agregar una carpeta como referencia y no desea compilarla, use:

<Content Include="any_path\**\*.*">
  <Link>folder_in_B_project\%(RecursiveDir)%(FileName)%(Extension)</Link>
</Content>
Neshta
fuente
0

Saca el caparazón y agrega un enlace simbólico.

administrador de runas entonces

mklink /d LinkToDirectory DirectoryThatIsLinkedTo

Enlace simbólico BAM!

/ d especifica el enlace del directorio.

Funciona en Vista desde arriba de la caja. Se puede transferir a XP.

Documentación aquí: http://technet.microsoft.com/en-us/library/cc753194%28WS.10%29.aspx

Para aquellos que no están familiarizados con los enlaces simbólicos, es esencialmente un puntero a otro archivo o directorio. Es transparente para las aplicaciones. Una copia en el disco, varias formas de solucionarlo. También puede hacer un "enlace duro" que no sea un puntero a otra dirección, sino una entrada de ID de archivo real en NTFS para el mismo archivo.

NOTA: como se indica en los comentarios, esto solo funcionaría en la computadora donde creó el enlace simbólico y no funcionaría en un sistema de control de versiones como git.

John Vance
fuente
2
Esto solo sería útil para un único desarrollador (a menos que esté programado). Las otras soluciones forman parte del código fuente compartido, por lo que son más útiles universalmente.
JRoughan
La pregunta que se hizo no era sobre el código fuente compartido. Dicho esto, msysgit no admite enlaces simbólicos, por lo que es un fastidio.
John Vance
1
Esta no es una pregunta sobre el sistema de archivos. También tenga en cuenta que esta idea generará efectos secundarios graves con diferentes sistemas de control de fuente y sistemas de recursos de respaldo
g.pickardou
Aparentemente no tengo permiso para editar o eliminar mi pregunta. Tu primera objeción es tonta. La pregunta tampoco era explícitamente una pregunta de edición de archivos de proyecto, por lo que también debe votar a favor y rechazar todas esas respuestas. Se nota su segunda objeción, y si pudiera editar mi respuesta para agregar esa advertencia, lo haría.
John Vance