Carpeta de soluciones de Visual Studio como carpetas reales

120

Tengo una solución de Visual Studio. Actualmente, es una solución vacía (= sin proyectos) y he agregado algunas carpetas de soluciones.

Las carpetas de solución sólo parecen ser "carpetas virtuales", porque en realidad no se crean en el sistema de archivos y los archivos dentro de las carpetas de solución simplemente se encuentran en la misma carpeta que el archivo .sln.

¿Hay alguna configuración que haya pasado por alto que le indique a Visual Studio que trate las carpetas de solución como carpetas "reales", es decir, que las cree en el sistema de archivos y mueva los archivos a él cuando los muevo dentro de la solución a una de esas carpetas?

Editar: Gracias. Voy a hacer una sugerencia para VS2010 entonces :)

Michael Stum
fuente
52
Esta es una de las peculiaridades más molestas de Visual Studio
Andy White
¿Cómo puedo lidiar correctamente con esta peculiaridad?
Hellboy
Lo curioso es que Rider tiene esta característica (pero la carpeta debe estar en la misma ruta que el archivo .sln, y la referencia real de la carpeta no se almacena en el archivo .sln): jetbrains.com/help/rider/Extending_Your_Solution. html
rsenna
Estoy usando VS 2017 y, por lo que puedo decir, MS aún no ha agregado una función para permitir agregar carpetas completas a una carpeta de solución; se deben agregar archivos individuales.
Theo

Respuestas:

43

Sin escenario especial. No creo que sea compatible.

Puede crear carpetas reales en un "proyecto" dentro de la solución, pero no en la solución en sí.

svlists
fuente
1
Esto todavía parece ser exacto a partir de VS 2017.
Theo
2
... y VS 2019
whymatter
una de las peores cosas de VS. ¿Por qué MS no mantiene las carpetas Sln como una opción, pero TAMBIÉN permite que se agreguen carpetas REALES a la solución? Muy molesto. El sistema de archivos funciona, por qué reinventar la rueda (como un cuadrado).
MemeDeveloper
46

Existe una solución alternativa, que en realidad se comporta como se esperaba .

  1. Agregar un sitio web nuevo o existente a la solución. (Normalmente creo uno nuevo).
  2. Solo asegúrese de que se haya creado dentro de la carpeta de su solución. (A veces incluso creo un "enlace" a una carpeta externa, por ejemplo, 'Documentos' o 'Marketing' en un recurso compartido de red. En ese caso, Git lo ignora, por supuesto).
  3. ¡Asegúrese de ir a la configuración del "Proyecto" o al Administrador de configuración para excluir este "Sitio web" de Build and Deploy !

Hecho. Ahora el Explorador de soluciones reflejará cualquier cambio en el sistema de archivos y viceversa (incluidas las subcarpetas).

Lo uso (extraño) para especificaciones, documentos, PM y algunos scripts de DevOps que se comparten dentro del equipo. Es fácil elegir qué incluir o no en el control de código fuente y (si se configura correctamente) no entra en conflicto con la compilación.

Sé que la función no está destinada a ese caso de uso, pero a excepción del icono de "Proyecto", quizás engañoso, todavía no encontré ninguna escasez en ese truco. Y todavía hay casos de uso en los que las carpetas de soluciones clásicas (virtuales) que proporciona VS encajan en la imagen. ¿Qué piensas?

Miguel
fuente
4
Aquí están las instrucciones completas: Haga clic con el botón derecho en la solución -> "Agregar" -> "Nuevo sitio web ..." -> (Elegí "Sitio web vacío ASP.NET"). Después de cambiar la ubicación, no olvide agregar "\ MyName" a la ruta; de lo contrario, hacer clic en "Aceptar" simplemente volverá a abrir el cuadro de diálogo. Después de eso, haga clic derecho en su solución -> "Propiedades" -> "Propiedades de configuración" -> desmarque "Construir" para el proyecto web.
user764754
¿Esto sigue funcionando? usando VS2015 pero no funciona.
Jan Paolo Go
En VS2017 crea perfectamente una carpeta real, pero el icono del sitio web (círculo oscuro) se muestra en el Explorador de soluciones. ¿Alguien sabe cómo solucionarlo?
Andrei Karcheuski
Sí, funciona en VS2019, pero aún no monitorea los cambios en el sistema de archivos. Ocasionalmente debe "Actualizar" para ver los archivos actuales. Si solo los proyectos C # no fueran el único tipo de solución para admitir el .*projformato nuevo, más limpio y claro basado en el sistema de archivos global .
Shannon
33

En Visual Studio 2017, haga clic en el icono "Soluciones y carpetas" en la ventana del Explorador de soluciones. Este botón cambia de la vista de "solución" virtual a una "vista de origen" que coincide con el diseño de carpetas y archivos en el sistema de archivos. Cuando agrega una nueva carpeta, la carpeta se crea físicamente en la ubicación esperada. soluciones y carpetas.

OdeToCode
fuente
1
Esto es útil, pero en la "vista de código fuente" perdió todos los accesos directos del botón derecho en un proyecto, es decir, "Administrar paquetes NuGet".
David Liang
1
¿Por qué solo las soluciones o proyectos C ++ se comportan de manera diferente en comparación con otros lenguajes?
Friendly Ghost
1
Esto me ayudó, así que creé una carpeta en la vista de carpeta donde la quería, luego agregué una carpeta de solución y agregué el proyecto como un elemento secundario de la carpeta. Doesnt realmente tiene sentido para mí, pero esta respuesta me ayudó
hanzolo
Eso es exactamente lo que quiero. ¡Gracias!
user1633272
10

La respuesta elegida sugiere que sería posible utilizar proyectos reales en lugar de carpetas de soluciones, pero no explica realmente cómo. Supongo que lo que estoy describiendo aquí es posiblemente la forma menos incómoda de lograr eso ... :-P

El problema con los archivos de proyecto normales es que eventualmente serán compilados por MSBUILD. Y si desea tener un proyecto que solo contenga archivos no compilables, será un problema.

Pero hace algún tiempo Visual Studio introdujo un nuevo tipo de proyecto: Proyecto compartido (extensión .shproj). Este tipo de proyecto no se compila de forma predeterminada, sino solo cuando (y solo si) otro proyecto hace referencia a él.

Entonces, una parte del truco aquí es usar proyectos compartidos en lugar de carpetas de soluciones . Obviamente, es posible agregar un proyecto compartido al que nunca se hace referencia en ningún otro proyecto, lo que significa que podemos evitar el problema presentado anteriormente.

Luego, al usar la <None Include="**/*" />cláusula en el archivo .shproj, podemos hacer que refleje automáticamente cualquier archivo y / o subcarpeta nuevos.

Así que básicamente haz esto:

  • Cree una nueva carpeta en su solución.
  • Agregue un nuevo archivo .shproj en la raíz de esta nueva carpeta.
  • Haga referencia al nuevo .shproj en su solución.

Por ejemplo, en mi caso, he creado un DockerDev.shproj, por lo que puedo agrupar algunos scripts relacionados con Docker que ejecutamos solo en nuestras máquinas de desarrollo:

<?xml version="1.0" encoding="utf-8"?>
<!-- DockerDev/DockerDev.shproj -->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="**/*" />
  </ItemGroup>
</Project>

Este archivo .shproj realizará un seguimiento de cualquier archivo, en cualquier subcarpeta de esta nueva DockerDevcarpeta en mi solución.

Por lo que pude ver, esta solución funciona de manera muy similar a lo que solicitó el OP: funcionará como una referencia no compilable a una carpeta y reflejará automáticamente cualquier cambio realizado en ella.

rsenna
fuente
En mi experiencia, esto se acumula tan pronto como un miembro desprevenido del equipo toca las propiedades del archivo; después de lo cual aparecerán archivos duplicados en el panel de navegación. Bajo algunas condiciones, cada archivo termina enumerado en el archivo .proj y luego se produce la fealdad. Aunque no me gusta rendirme, sigo prefiriendo el enfoque "Agregar sitio web existente".
Shannon
@shannon Nunca experimenté el comportamiento que estás mencionando, pero "la ausencia de evidencia no es evidencia de ausencia", así que ahí está. Pero uso proyectos compartidos a diario, así que creo que eso también cuenta. En cuanto a los Proyectos de Sitios Web (WSP), también podrían funcionar, supongo, hace mucho tiempo que no lo uso.
rsenna
8

Sara Ford contribuyó con una macro para agregar hacer esto. En Visual Studio 2010, si abre su Explorador de macros, verá una macro llamada "GenerateSlnFolderOnDirStructure". Esto automatizará la creación de Carpetas de soluciones y agregará los archivos.

SwampyFox
fuente
6

Carpeta a carpeta de solución por Cecilia Wirén - CeciliaSHARP

Elimine la molestia de agregar varios archivos a la carpeta de la solución. Simplemente use el menú contextual para la solución y, justo debajo de la opción de crear una nueva carpeta de solución, ahora encontrará 'Agregar carpeta como carpeta de solución'. Esto creará una carpeta de solución con el mismo nombre que seleccionó y agregará los elementos dentro de esa carpeta a la carpeta de solución. Esto no moverá los archivos en el disco.

Ryan
fuente
3

No, no es compatible. Como sospechaba, las carpetas de soluciones son simplemente subentradas virtuales en el archivo .sln, nada que ver con el sistema de archivos.

Alan
fuente
3

Visual Studio no tiene soporte para esto. Sin embargo, hice una extensión que hace algo similar para VS2013. Asigna carpetas de soluciones a carpetas físicas en su disco duro, aunque la asignación es unidireccional (desde el disco duro a la solución). Eso significa que el contenido de una carpeta de solución reflejará el contenido de la carpeta del disco duro y no al revés.

Con eso fuera del camino, la extensión aún puede ser útil. Tiene soporte para mapear carpetas de soluciones a carpetas físicas, filtrar archivos y directorios basados ​​en expresiones regulares y recordar asignaciones en su archivo .sln. Las propiedades no son intrusivas, por lo que los desarrolladores sin la extensión aún pueden abrir el sln y no verse afectados.

Alojado en la galería de Visual Studio: https://visualstudiogallery.msdn.microsoft.com/69e19ea6-4442-4cb6-b300-044dd21f02bd

Editar: subido a bitbucket. Ahora de código abierto. Licencia MIT. https://bitbucket.org/LSS_NorthWind/physical-solution-folders

viento del norte
fuente
3

Nota: Sí, esto es posible, puede crear una carpeta en la raíz, pero es un poco complicado ...

Dando algunos esfuerzos adicionales puedes hacerlo ¿Cómo? Sigamos el paso

  • 1-Crear carpeta, por ejemplo: " nueva carpeta " en la raíz (donde reside su archivo .sln).
  • 2. Copie y pegue sus proyectos dentro de la carpeta.
  • 3.Vaya a su archivo sln y busque proyectos movidos y agregue nueva carpeta \ en la dirección del proyecto movido.
  • 4.Guarde el archivo sln.
  • 5.Abra su proyecto y confirme el repositorio en git o así ...
  • 6. Tome el repositorio en una ubicación nueva.

    Estás listo...

si aún no puede ver su carpeta -----

  • 1.Agregue una carpeta de soluciones xyz.
  • 2.Abra el archivo sln y cambie el nombre de esa carpeta por su nombre de carpeta.

Felicitaciones que terminaste ...

Si tiene algún problema, escríbame para pedir ayuda.

Ankit
fuente
3

Cree una "carpeta de soluciones". Esto creará una carpeta lógica, pero no física. Haga clic derecho en la carpeta de la solución y abra un cuadro de diálogo de nuevo proyecto. Pero antes de hacer clic en Aceptar, debe cambiar la ubicación de un proyecto a la carpeta física deseada y VS la creará y colocará el proyecto dentro.

rc21
fuente
1

Puede agregar carpetas reales eligiendo "Agregar nuevo filtro" para un archivo de proyecto de Visual Studio. También puede hacer "Agregar nuevo filtro" en una carpeta existente. Una vez creada la carpeta, cámbiele el nombre y agregue el archivo de origen o de encabezado o lo que se adapte a su proyecto. Esta es una forma que conozco que nos permite crear carpetas reales a través del IDE de Visual Studio.

Abhijit K Rao
fuente
Esta característica es específica de los proyectos de C ++.
Tamir Daniely
Esta solución también se aplica a los proyectos VS: la pregunta es sobre las carpetas de nivel de solución.
Theo
0

La carpeta creada debajo de la solución será virtual como se dijo. Tal vez esto podría llamarse una solución alternativa, pero puede crear físicamente la carpeta en el disco antes o cuando agregue un nuevo elemento / proyecto y Robert debería ser hermano de su padre.

PD: en una mirada más cercana, tal vez debería explicar que "Bob es tu tío" significa que estás bien / ordenado.

paloma
fuente
¿Importa si Robert es el hermano de tu madre?
Darrel Lee
0

Yo mismo he querido esta función varias veces, pero al final del día, realmente NO quieres la capacidad de hacer esto. Piense en su solución (archivo) como la raíz de una aplicación web y piense en las carpetas de la solución como directorios virtuales (literal y funcionalmente). El contenido de un directorio virtual web podría estar físicamente en un servidor completamente diferente. Donde Visual Studio confundió el concepto de carpetas de solución es permitiéndole crear nuevos archivos dentro de la carpeta. Siempre debe "Agregar existente" al agregar contenido. Cuando agrega existente, crea un vínculo a la ubicación de origen del archivo.

Pero la razón por la que no desea que las carpetas de soluciones se comporten como carpetas "físicas" es porque el diseño de su solución no necesariamente usa la misma convención que el diseño de control de código fuente. Las carpetas de soluciones le permiten personalizar la jerarquía de sus proyectos para que pueda agrupar proyectos y elementos de la forma que desee, y luego decidir que no le gusta y cambiarlo nuevamente sin tener que pasar por la pesadilla de mover elementos de control de fuente alrededor e irritando al resto de su equipo.

Pablo pascua
fuente
1
Esta es la respuesta correcta: cree el archivo en el disco en una carpeta con el mismo nombre que la carpeta virtual, luego agregue el archivo en VS usando 'Agregar existente'.
Richard
4
Podrían haber implementado fácilmente carpetas virtuales y físicas. Claramente es un mirador. Ver referencia: todos los demás IDE, nunca.
Tamir Daniely
6
No entiendo en absoluto por qué el concepto de directorios virtuales (IIS) tiene algo que ver con las carpetas de soluciones. En cuanto al argumento de control de fuente, no veo el problema. ¿Por qué los movimientos de archivos irritarían al resto de su equipo? Es una operación común. ¿Y por qué querría que el diseño de los archivos en el control de fuente sea diferente al diseño físico?
user247702
2
Carpetas de soluciones físicas pueden hacer que sea más fácil (aunque sea sólo un poco) para crear estructuras de carpetas modernos como NancyFx de , donde múltiples proyectos se dividen en categorías como src, test, tools, etc Usted sería definitivamente quiere tomar esa decisión desde el principio del proyecto a su punto acerca irritando al equipo, pero eso es cierto para la mayoría de las decisiones arquitectónicas.
Eric Eskildsen
3
-1 Mi caso de uso es este: a veces solo queremos agregar ciertos documentos a la solución. No se construirán, pero se mantendrán en el control de fuente. Normalmente tenemos una carpeta especial para ellos. Me gustaría tener esa carpeta en mi solución, no los archivos que contiene, sino la carpeta en sí. Sí, hay formas de eludir esta limitación, pero no son óptimas. Tener una referencia real a una carpeta en la solución simplemente funcionaría.
rsenna
0

Tengo una pequeña solución para esto (no es genial, pero funciona).

  1. Cree una carpeta en su solución (es decir, "Contoso")
  2. Haga clic derecho en la solución y luego haga clic en "Abrir carpeta en el Explorador de soluciones"
  3. Cree la carpeta física (es decir, "Contoso") en el directorio de la solución
  4. Copie / cree archivos en la carpeta física.
  5. Arrastre los archivos a la carpeta virtual en el explorador de soluciones.

No es genial porque necesitará mantener manualmente las referencias del archivo, pero me funciona.

Matthew Layton
fuente