Como parte de una solución que contiene muchos proyectos, tengo un proyecto que hace referencia (a través de <ProjectReference>
otros tres proyectos en la solución, más algunos otros). En el AfterBuild
, necesito copiar las salidas de 3 proyectos dependientes específicos a otra ubicación.Determinación de salidas de ProjectReference en MSBuild sin activar reconstrucciones redundantes
Via diversas respuestas SO, etc., la forma en que se establecieron en lograr que era:
<MSBuild
Projects="@(ProjectReference)"
Targets="Build"
BuildInParallel="true"
Condition="'%(Name)'=='ProjectA' OR '%(Name)'=='ProjectB' OR '%(Name)'=='ProjectC'">
<Output TaskParameter="TargetOutputs" ItemName="DependentAssemblies" />
</MSBuild>
<Copy SourceFiles="@(DependentAssemblies)" DestinationFolder="XX" SkipUnchangedFiles="true" />
Sin embargo, me encontré con problemas con esto. La tarea <MSBuild
del paso IncrementalClean
termina borrando varias salidas de ProjectC
. Al ejecutar esto en VS2008, se deposita un archivo build.force
en la carpeta obj/Debug
de ProjectC que luego activa la reconstrucción de ProjectC si realizo una generación en la solución completa si el proyecto contiene este AfterBuild
objetivo, mientras que si uno excluye este proyecto de la compilación, [correctamente] no desencadena una reconstrucción de ProjectC (y críticamente una reconstrucción de todos los dependientes de ProjectC). Esto puede ser un truco específico de VS en este caso que no ocurriría en el contexto de una invocación de TeamBuild u otra línea de comandos de MSBuild (pero el uso más común será a través de VS, así que necesito resolverlo de cualquier manera)
los proyectos (y el resto de la solución en general) se han creado interactivamente con VS, y por lo tanto, el ProjectRefence
s contiene rutas relativas, etc. He visto mencionar que esto podría causar problemas, pero sin una explicación completa de por qué, o cuándo se solucionará o cómo solucionarlo. En otras palabras, no estoy realmente interesado en, p. convirtiendo las rutas ProjectReference
en rutas absolutas editando manualmente .csproj.
Si bien es completamente posible que estoy haciendo algo estúpido y alguien inmediatamente señalará lo que es (que sería genial), tenga la seguridad de que he dedicado mucho tiempo estudiando /v:diag
salidas, etc. (aunque no lo he probado para construir una repro desde cero - esto es, en el contexto de una relativamente compleja estructura global)
En primer lugar, gracias/felicidades por elegir este rompecabezas como su primera respuesta SO. Personalmente, me mostraría reticente a introducir una dependencia en el funcionamiento interno de MSBuild de esta naturaleza, pero sí, esto ciertamente me permitiría lograr los "archivos que escribió" programáticamente. Hay algunas otras preguntas de "cálculo de los resultados" aquí en SO que podrían encajar mejor como respuesta. El problema principal aquí para mí es que el bit '