En nuestra tienda, estamos utilizando Cruise Control & MSBuild para automatizar las compilaciones del producto como parte de la integración continua.Obtener InternalsVisibleTo para trabajar cuando el proceso de compilación firma el ensamblado con nombres fuertes?
Parte de la compilación consiste en firmar los ensamblajes para que tengan nombres seguros.
En nuestros archivos de proyecto cuando desarrollamos localmente, no especifica la firma, ya que esto es reemplazado por el script MSBuild.
Esto está muy bien hasta que decidí que me gustaría introducir pruebas unitarias que requieren que use el atributo InternalsVisibleTo
. También comencé a usar una buena biblioteca de código abierto que tiene pruebas unitarias que también usan esta técnica.
Esto significa que, en mi máquina, puedo actualizar AssemblyInfo.cs
utilizar la siguiente declaración:
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")]
y todo está bien.
Sin embargo, comprobar esto en las pausas de la construcción ya que la construcción de la máquina firma los montajes, sería necesario que la línea de ser actualizado para parecerse a esto en su lugar:
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests,
PublicKey="magic key here..)"]
tengo casi decidido a no firmar las asambleas y llámalo un día. Sin embargo, "la firma de montajes es una buena práctica" (repetir este mantra 3 veces), y si estamos recibiendo ningún beneficio de hacer esto, no quiero a distancia él.
No instalamos en el GAC, no estamos especialmente preocupados por la manipulación, no tenemos que preocuparnos por los terceros que utilizan nuestras bibliotecas, actualizamos todos nuestros archivos a la vez cuando actualizamos la aplicación. El beneficio más identificable es alguien de apoyo no puede copiar alguna versión aleatoria de un ensamblado en la carpeta de tiempo de ejecución y tienen cosas parecen funcionar por un tiempo.
No quiero abrir la lata de trabajos involucrados con el cambio de alrededor de 100 archivos de proyecto manualmente para habilitar la firma. Asimismo, no quiero cortar las cosas marcando las cosas que deben ser internos como públicos, no quiero entrar en redirecciones vinculantes & que no quiero para eliminar las pruebas unitarias.
Me gustaría tener la facilidad de no tener nombres fuertes con todas las ventajas de tener nombres fuertes (si los hay), y no quiero crear mucho trabajo adicional para hacerlo. es mucho para preguntar?
Este post describe el problema y una solución bien, pero yo no soy mucho de un tipo script de MSBuild para tomar ventaja de ella:
http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/02df643c-956a-48bd-ac01-4a1016d91032/
¿Cuál es la solución adecuada a este problema?
Cualquier entrada y punto de discusión son bienvenidos.
Gracias Thomas, voy a probar esto y lo aceptaré como la respuesta una vez que lo haga funcionar. Hay algunos problemas para firmarlo con fuerza en todas partes, principalmente porque no estoy seguro de cómo guiar ese cambio y no quiero hacerlo manualmente. Nuestra secuencia de comandos de compilación existente, que fue escrita por alguien que conoce MSBuild mejor que yo, firma y voy a modificarla un poco en lugar de introducir un cambio importante. – Wes
Nunca hice que esto funcione, pero lo marcaré como la respuesta. Lo que no funcionó es el ItemGroup llamado AssemblyInfoFiles ... siempre estaría vacío ... alguna idea de por qué? El patrón Incluir es básicamente lo que publicaste ... ¡Gracias! – Wes
El ItemGroup anterior asume que los archivos AssemblyInfo.cs a parche se encuentran en un directorio debajo del script de compilación; el comodín '**' coincidirá con cualquier directorio que esté por debajo del actual. Consulte [Cómo seleccionar los archivos para compilar] (http://msdn.microsoft.com/en-us/library/ms171454.aspx) para obtener más información sobre la sintaxis de MSBuild include. –