¿Cómo comparte scripts entre múltiples proyectos en una sola solución?

En caso de que la pregunta no fuera clara. Tengo 3 proyectos MVC en una solución. Cada vez que creo un nuevo proyecto, agrega la carpeta “Scripts” con todos los archivos .js que necesitaré. No quiero tener esto creado cada vez para cada aplicación. ¿Hay alguna forma de referenciar los scripts desde una carpeta central en la solución para que todas las aplicaciones / proyectos puedan compartir una carpeta común de scripts con todos los scripts comunes entre ellos?

Editar: explique los pros y los contras de hacer esto si hay alguno … ahora tengo curiosidad.

Esto es lo que recomendaría:

Haga clic con el botón derecho en la solución y cree una Nueva carpeta de soluciones denominada Common Javascript Files (o lo que sea que desee llamarlo).

Nueva carpeta de soluciones

Carpeta común de la carpeta de archivos Javascript

Haga clic con el botón derecho en la Solución, haga clic en Abrir carpeta en el Explorador de Windows o navegue allí manualmente para ver otras versiones de Visual Studio 🙁

Abrir carpeta en Windows Explorer

En el directorio de la solución, cree un directorio con el mismo nombre que la carpeta de la solución (las carpetas de solución normalmente no coinciden con los directorios en el nivel del código fuente, pero esto lo hará por motivos de cordura).

Directorio común de archivos de Javascript

En este nuevo directorio, agregue los archivos que deben compartirse entre las soluciones.

Agregar archivos Javascript al directorio

En Visual Studio, haga clic en la carpeta de la solución y seleccione AgregarElemento existente .

Visual Studio Add - Itme existente

En el cuadro de diálogo de selección de archivos, vaya al directorio anterior creado, seleccione los archivos agregados al directorio y haga clic en Agregar .

Seleccionar archivos para agregar

Archivos de carpetas de soluciones

En cada proyecto que necesite un archivo compartido, haga clic con el botón derecho en el proyecto (o directorio dentro del proyecto) y haga clic en AgregarElemento existente .

Proyecto Agregar elemento existente

Navegue hasta el Directorio compartido, seleccione los archivos y haga clic en la flecha desplegable luego haga clic en Agregar como enlace .

Añadir como enlace

Ahora los archivos en los proyectos son esencialmente accesos directos a los archivos en la Carpeta de soluciones. Pero se tratan como archivos reales en el proyecto (esto incluye archivos .CS o Visual Basic, se comstackrán como archivos que realmente existen en el proyecto).

Archivos vinculados

PROS

  • Los archivos se comparten realmente entre proyectos en tiempo de diseño
  • Solo se pueden agregar los archivos necesarios para cada proyecto, no es todo o nada
  • No requiere ninguna configuración en IIS (directorio virtual, etc.)
  • Si la solución está en control de fuente TFS, puede agregar el directorio a la fuente TFS y los archivos compartidos estarán controlados por la fuente.
  • Al editar un archivo seleccionándolo en el Proyecto, se editará el archivo real.
  • Eliminar un archivo vinculado no elimina el archivo.
  • Esto no se limita a los archivos JS, los archivos vinculados pueden ser CUALQUIER archivo que pueda necesitar (imágenes, CSS, Xml, CS, CSHTML, etc.)

CONTRAS

  • Cada implementación obtiene su propio archivo.
  • Hay una pequeña curva de aprendizaje al entender que las Carpetas de Solución no son Directorios que existen en un Directorio de Soluciones.

Lo mejor que puede hacer, imo, es rodar su propia CDN … Básicamente solo cree otro sitio en IIS y asígnele su propio enlace, por ejemplo, ” http://cdn.somedomain.com

A continuación, almacene todas sus css / js / fonts / imágenes compartidas, etc. en el sitio CDN y conéctelas desde sus otros sitios.

Al hacerlo, resuelve 2 problemas,

  1. Todas tus cosas se comparten cuando es necesario y solo tienes que administrar 1 revisión por archivo.
  2. Los navegadores de tus usuarios pueden almacenarlos en caché en 1 sola ubicación en lugar de descargar copias de tus cosas para cada sitio que los utiliza.

Agregué esta respuesta porque veo a mucha gente refiriéndose a la creación de directorios virtuales. Si bien eso sí comparte los archivos, crea múltiples rutas de descarga para ellos, lo cual es una pérdida extrema de ancho de banda. ¿Por qué hacer que sus usuarios descarguen jquery.js (1 * cantidad de sitios) cuando puede permitir que se descarguen una vez en (cdn.somedomain.com).

Además, cuando digo pérdida de ancho de banda, no solo estoy hablando del ancho de banda del servidor, sino de los usuarios de dispositivos móviles en los planes de datos … Como ejemplo, llego a mi sitio de recursos humanos de la empresa (insuficiencia, etc.) en mi teléfono el día y consumió 250 mb al salir, descargó jquery y un montón de cosas 5 veces cada uno … En un plan de datos de 2 gb por mes, los sitios web que lo hacen realmente me molestan.

Aquí va, IMO, la mejor y más fácil solución, pasé una semana tratando de encontrar la mejor y más fácil manera que siempre tenía más inconvenientes que ventajas:

 Resources(DLL) Shared images image.png css shared.css scripts jquery.js MvcApp1 Images Content Shared <- We want to get files from above dll here ... MvcApp2 Images Content Shared <- We want to get files from above dll here ... 

Agregue lo siguiente a MvcApp1 -> Proyecto -> Propiedades de MvcApp1 -> Eventos de comstackción -> evento de comstackción posterior:

 start xcopy "$(SolutionDir)Resources\Shared\*" "$(SolutionDir)MvcApp1\Shared" /r /s /i /y 

Aquí hay una explicación de lo que hace: Incluir el directorio de archivos de contenido de acción de comstackción desde el ensamblado al que se hace referencia en el mismo nivel que el directorio bin

Haz lo mismo para MvcApp2. Ahora, después de cada creación, se copiarán nuevos archivos estáticos en su aplicación y podrá acceder a archivos como "~ / Shared / css / site.css".

Si lo desea, puede ajustar el comando anterior para copiar scripts de .dll a la carpeta de scripts de cada aplicación, de esa manera podría mover algunos scripts a .dll sin tener que cambiar ninguna ruta, aquí hay un ejemplo:

Si desea copiar solo las secuencias de comandos de Recursos / Compartidos / scripts en MvcApp1 / scripts después de cada comstackción:

 start xcopy "$(SolutionDir)Resources\Shared\Scripts\*" "$(SolutionDir)MvcApp1\Scripts" /r /s /i /y 

Esta es una respuesta tardía, pero Microsoft ha agregado un tipo de proyecto llamado Shared Project inicia Visual Studio 2013 Update 2 que puede hacer exactamente lo que usted desea sin tener que link archivos.

La referencia del proyecto compartido aparece bajo el nodo Referencias en el Explorador de soluciones, pero el código y los activos en el proyecto compartido se tratan como si fueran archivos vinculados al proyecto principal.

“En versiones anteriores de Visual Studio, podías compartir el código fuente entre proyectos mediante Agregar -> Objeto existente y luego elegir Vincular. Pero esto era un poco raro y cada archivo fuente separado tenía que seleccionarse individualmente. plataformas dispares (iOS, Android, etc.), decidieron facilitar el intercambio de fonts entre proyectos al agregar el concepto de Proyectos Compartidos “.

https://blogs.msdn.microsoft.com/somasegar/2014/04/02/visual-studio-2013-update-2-rc-windows-phone-8-1-tools-shared-projects-and-universal- ventanas-aplicaciones /

Información de este hilo:

¿Cuál es la diferencia entre un proyecto compartido y una biblioteca de clases en Visual Studio 2015?

https://stackoverflow.com/a/30638495/3850405

En IIS, cree una carpeta virtual que apunte a la misma carpeta de scripts para cada una de las 3 aplicaciones. Entonces solo necesitarás guardarlos en una sola aplicación. Existen otras alternativas, pero realmente depende de cómo estén estructuradas sus aplicaciones.

Editar

Una idea más aterradora es usar áreas. En un área común, tenga un directorio de scripts con los scripts configurados para ser comstackdos. Entonces sírvete tú mismo sacándolos del dll. Esta podría ser una buena idea si prevé que el Área común tendrá más funcionalidad más adelante.

Una sugerencia que le permitirá depurar sus scripts sin volver a comstackr el proyecto:

  • Elija un proyecto ” maestro ” (que usará para la depuración) y agregue los archivos físicos a él
  • Use la función “Agregar como enlace” como se describe en la respuesta de Eric para agregar los archivos de script a los otros proyectos en la solución
  • Utilice la tarea CopyLinkedContentFiles en Build, como se sugiere en el comentario de Mac para copiar los archivos al segundo sobre sus proyectos adicionales

De esta forma, puede modificar los scripts en el proyecto ” maestro ” sin reiniciar el depurador, lo que para mí es el mundo de la diferencia.

La mayoría de los archivos que están incluidos por defecto también están disponibles a través de varios CDN.

Si no está agregando sus propios scripts personalizados, es posible que ni siquiera necesite un directorio de scripts.

CDN de Microsoft para scripts: http://www.asp.net/ajaxlibrary/cdn.ashx