visual studio - valido - ¿Cómo verificar todos los proyectos en solución para algunos criterios?
visual studio code español (3)
Hay una manera mucho más simple de manejar este tipo de cosas. En lugar de tratar de cambiar dinámicamente los contenidos del archivo de proyecto, puede usar una compilación de archivos .targets compilados que se importan a sus proyectos de Visual Studio a través del mecanismo descrito en http://msdn.microsoft.com/en-us/library/ms171464. aspx (con otro ejemplo en http://msdn.microsoft.com/en-us/library/ms171464.aspx ).
Debo dejar que todos los proyectos en solución contengan algunas acciones de compilación adicionales, por ejemplo, validación de StyleCop, autogenación de AssemblyInfo, etc.
Mi idea es realizar algún tipo de evento de preconstrucción en toda la solución que verifique todos los archivos del proyecto para que contengan nodos que coincidan con xPath específico. No es una parte difícil, se puede resolver con tareas de compilación personalizadas o con tareas de manejo de Xml de terceros. No investigué profundamente aún, pero definitivamente no hará que un problema valga la pena mencionar aquí.
Las preguntas son cómo
1) extender archivo de solución con algunas tareas personalizadas? No debería ser una parte integral de la solución. Se desea, pero se puede omitir al crear desde VS, será suficiente tener alguna línea de comando específica que lo ejecute.
2) si no es posible, hay una opción descrita en "¿ Pre-build event en toda la solución? ". Es hacky, pero si no hay otras opciones, lo usaré. Pero, ¿cómo obtener una lista de archivos de proyecto desde el archivo de solución? Tenga en cuenta que la carpeta que contiene la solución puede contener archivos de proyecto adicionales que no deberían verificarse, así que simplemente enumere todo ***. * Proj no es una opción.
PD: cualquier otra opción para todo el problema también es bienvenida :)
Nunca he abordado este problema desde el nivel de solución: no tiene mucho control cuando llama a msbuild contra un archivo de solución.
En cambio, generalmente he abordado esto haciendo que cada proyecto en la solución importe otro archivo msbuild que contenga todos los objetivos comunes. Esto le da un control detallado sobre lo que hará cada proyecto, ya que mencionó que cada proyecto en la solución no necesita hacer todas las tareas adicionales.
<Import Project="_pathToCommonTargets_" />
Después de importar los objetivos comunes, puede controlar lo que sucede con los ganchos en el proyecto de compilación, es decir, los objetivos anulables que ocurren en puntos específicos cuando se llama a "Build" en ese proyecto. Además, puede crear nuevos objetivos en el archivo de objetivos comunes que puede llamar en lugar del objetivo de compilación, para cuando construya fuera de Visual Studio.
<Target Name="AfterBuild" >
<!-- Other tasks here -->
<!-- Calling a common target -->
<CallTarget Target="_commonTargetName_" />
</Target>
Además, no recomendaría usar algo como XPath para determinar qué nodos hay en cada archivo de proyecto. Sería mucho más limpio usar las funcionalidades incorporadas en msbuild. Por ejemplo, puede verificar si las propiedades están establecidas (elementos secundarios de los nodos del grupo de propiedades) y realizar operaciones contra las colecciones (elementos secundarios de los nodos del grupo de elementos).
- Página de inicio de Msbuild: http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx
- Objetivos personalizados reemplazables de Msbuild: http://msdn.microsoft.com/en-us/library/aa337604.aspx
Puede crear cualquier tarea personalizada con cualquier condición utilizando la función integrada de MSBuild para ampliar la funcionalidad: CustomAfterMicrosoftCommonTargets , CustomBeforeMicrosoftCommonTargets .
Ver mi ejemplo . Puede agregar tareas personalizadas en su archivo .targets para cada paso en el proceso de compilación. Puede agregar condiciones para activar / desactivar esas acciones, etc. No se basa en archivos sln, pero puede tener tareas que serán específicas de VS con la condición ''$ (BuildingInsideVisualStudio)'' == ''true'' . Puede llamarlos desde la línea de comandos; necesita especificar el nombre del objetivo con la tecla / t: MyCustomTarget .
Efectos colaterales: si su objetivo personalizado no tiene condiciones específicas, se llamará en cada proyecto similar.