2008-10-23 9 views
5

En nuestro entorno, tenemos una carpeta Lib que contiene varias asambleas de terceros a las que hacen referencia nuestros proyectos. Por ejemplo, Enterprise Libary y Elmah.¿Cómo evitar que Visual Studio actualice las referencias de ensamblaje?

A veces, un desarrollador no hace una actualización en esa carpeta. Cuando el desarrollador carga un proyecto que no puede encontrar el ensamblado en la carpeta esperada, Visual Studio localiza automáticamente otra copia y actualiza las referencias del proyecto.

El problema ocurre cuando el desarrollador comprueba el proyecto y atornilla a todos los demás.

¿Hay alguna manera de evitar que Visual Studio 2008 haga esto?

ACTUALIZACIÓN: quería agregar que estamos utilizando TFS para el control de código fuente.

+0

Sí, es una mierda, es exactamente por eso que nunca puse nada en GAC. –

+0

También parece que el problema es con sus desarrolladores, tal vez podría hacer algo para enseñarles a no cometer este error, es decir, cada vez que alguien comete un error, paga 5 $, eso debería ayudarlos a recordar :) –

+0

El problema principal era con ensamblajes GAC como los controles DevExpress. Terminamos asignando a 1 persona a ser responsable de actualizar la carpeta lib con ensamblajes de terceros y nadie más tenía permiso para instalarlos. Fue un poco doloroso para esos controles, pero funcionó. – NotMe

Respuesta

4

Así es como protegemos contra eso en mi empresa. (Su kilometraje variará!)

Cualquier referencia que no sea del sistema (o no GAC) proviene de nuestro servidor de desarrollo, que cada desarrollador ha asignado a su W: unidad. Tenemos un directorio DLL común, con subdirectorios por cliente (o proveedor) y otros subdirectorios según corresponda. No hay archivos DLL alguna vez almacenados en el control de código fuente, excepto license.dll según sea necesario por Infragistics de vez en cuando.

Para bibliotecas proporcionadas por proveedores (EntLib, Infragistics, etc.), como política que hacemos referencia desde la unidad W :. Período. Nadie está autorizado para hacer referencia desde ningún otro lado. Esto codifica la sugerencia en los archivos del proyecto en una ruta común.

Para bibliotecas internas (proyectos internos y de clientes), nuestro proceso de integración continua genera los archivos DLL en la rama correspondiente de este directorio, de nuevo, de donde provienen todas nuestras referencias.

Esto ralentiza nuestro tiempo de compilación local (para la depuración local), ya que VS actualizará automáticamente estas contra el servidor cada vez. Es una molestia (a veces un proyecto puede tomar 5 o 6 minutos para construir localmente), pero es un mal necesario trabajar con personas que usan referencias diferentes. La ventaja aquí es que tan pronto como alguien revisa el código de una de esas referencias, el servidor de CI inicia una compilación y todo el mundo lo acelera rápidamente.

El truco para esto es un proceso de compilación estable y repetible y un servidor de integración continua. Estamos usando CruiseControl.NET, integrado con las compilaciones NAnt, pero inserte aquí su servidor de CI favorito y herramienta de compilación.

Hasta ahora no hemos tenido ningún problema como resultado de este proceso, excepto cuando el servidor de compilación se activa mientras nuestro sistema de control de origen (también conocido como Demon Spawn, vea tantos de mis comentarios recientes) realiza un gran Check-in de múltiples archivos. (Dado que Demon Spawn no es compatible con los registros de transacciones). Sin embargo, esto es algo muy raro, tal vez una vez cada 5 o 6 semanas. Y una reconstrucción de la fuerza inmediatamente después se ocupa de ello.

Solo algunas reflexiones ... Esta técnica debería evitar que las personas arruinen el control de su fuente, y como una ventaja adicional, reduzca el tamaño de su control de fuente ya que no va a comprobar las DLL, solo dll.refresh archivos.

+0

Parece que esta es la respuesta correcta. Estamos usando TFS, y encontré ForbiddenPatternsPolicy que puede ver los archivos al registrarse. ¡Gracias! – NotMe

+0

¡No hay problema! ¡Espero que funcione para usted! –

1

No creo que esto sea posible.

Si abre un archivo de proyecto en un editor de texto, verá que el estudio visual no almacena referencias duras a los ensamblajes, pero almacena un "HintPath" en su lugar. Si no se encuentra la referencia, Visual Studio probará automáticamente el GAC.

Podría ser una buena idea configurar un servidor de integración continua (si aún no tiene uno) esto actuará como un sistema de alerta temprana para situaciones como esta.

+0

TeamCity es gratis para hasta 20 usuarios y 20 compilaciones. Es lo que estoy usando actualmente, y es bastante bueno. – MrBoJangles

+0

Tenemos la configuración de CI. Básicamente, estoy en el proceso de limpiar un gran lío de nuestro entorno Dev en el que alguien eligió todos esos ensamblajes en el servidor de compilación. El problema es que, por supuesto, algunas aplicaciones aquí usan versiones diferentes que causan más problemas cuando llega a producción. – NotMe

+0

sin embargo, supongo que mi próximo paso es limpiar el servidor de compilación, gracias. – NotMe

2

Estoy de acuerdo con John en la mayoría de los puntos, con la excepción de poner tus dlls en control de fuente.

Normalmente tengo una carpeta ThirdParty que tendrá fallas en el producto y la versión del proveedor, por lo que el toolkit ajax se almacena en $/ThirdParty/Microsoft/AjaxToolkit/(algunos números de versión). Me gusta este enfoque porque podemos ponerle una etiqueta a todos los artefactos que forman parte de una creación.

Otra idea podría ser para los dll dentro del proyecto, de modo que si obtienen lo último del proyecto obtendrán los dlls.

+0

He visto empresas en ambos sentidos. Hicimos esto una vez, pero nos detuvimos porque estábamos tratando de limitar el tamaño de los artefactos realmente contenidos en el control de la fuente. –

0

Sí, esto es ABSOLUTAMENTE INSANE y es realmente doloroso. Aquí hay otra opción para usted: 1. Elimine los ensamblajes de GAC, como sugieren otras publicaciones. 2. Haga que su sistema de resolución de dependencias entregue ensamblajes a su carpeta BIN. Aquí es donde también se compilarán todos sus ensambles de solución. 3. Establezca todas las referencias Copiar local = falso Y versión específica = False. El objetivo de esto es provocar una excepción de carga de ensamblaje al depurar, porque si no está en BIN, entonces no hay nada para copiarlo allí. Y sus soluciones se compilarán más rápido porque VS no tendrá que copiar archivos. Y esto evitará que dlls "no muertos" se ubiquen en algún lugar del directorio obj, que VS encontraría y copiaría milagrosamente ...

Esto funciona bien en las soluciones que usted controla. Hemos estado haciendo esto por años. Y es muy fácil averiguar si algo no funciona bien, entonces solo busca un ensamblado con Copy Local = true o Specific Version = True, que ocurre de vez en cuando (olvide, cansa, etc.). Mi problema actual es que no controlo la estructura o configuración de la solución en la que estoy trabajando, y por lo tanto estoy buscando una solución para este antiguo problema. Esperaba que el equipo de VS lo resolviera ... Por desgracia ... Equipo, detén este dolor.

Cuestiones relacionadas