wolcas - MSBuild orden de compilación
tags para responder (3)
Tengo una gran solución con más de 100 proyectos (C ++, Managed C ++, C #) y muchos de ellos dependen de cada uno.
Tengo un servidor TeamCity y quiero construir esta solución allí.
Cuando compilo la solución en VisualStudio, todo va bien, pero con TeamCity tengo un error CS0006. Sé por qué eso. TeamCity usa MSBuild 4 para crear soluciones, pero hay un error conocido en MSBuild 4: ignora el orden de compilación y los proyectos de compilación de las soluciones para que así lo desee. Debido a este comportamiento si tiene:
Project A
Project B which has reference to A
MSBuild puede construir estos proyectos en tal orden:
1. B
2. A
La solución más sencilla es establecer BuildProjectReferences = true (que es el valor predeterminado) y todo el proyecto al que se hace referencia se construirá automáticamente. Pero no puedo usar este enfoque porque no todos los proyectos referenciados en esta solución, y no puedo crear proyectos a partir de otra solución.
Aquí hay otra solución para este problema: use ConfigurationManager y deshabilite todos los proyectos, que no deberían compilarse, pero funciona solo en VisualStudio. MSBuild ignora eso y construye todos los proyectos a los que se hace referencia.
El problema es restaurar el orden de compilación que puedo ver en VisualStudio en la ventana ProjectBuildOrder que no es cierto si uso MSBuild directamente desde la consola.
La solución anterior no funcionó para mí cuando intenté crear un proyecto .Net Standard que dependía de la salida de un proyecto .Net Core. Tuve que agregar un "SkipGetTargetFrameworkProperties" adicional para obtener la solución para construir en VS2017 y MSBuild.
<ProjectReference Include="foo.csproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
</ProjectReference>
Tuve un problema muy parecido a este. Se manifestó en la solución, al requerir dos versiones antes de construir con éxito toda la solución.
Resulta que accidentalmente había agregado una referencia y no una ProjectReference (busque esto en el archivo .sln), lo que significa que VS / MSBuild requeriría y buscaría el archivo de biblioteca al que se hace referencia, pero desconozco completamente cómo construirlo si faltaba Eventualmente, el proceso de compilación llegaría al proyecto con la biblioteca a la que se hace referencia, la construirá y la pondrá a disposición para el próximo intento de compilación.
Dependiendo de su árbol de dependencias y el estado de ánimo particular de la cadena de herramientas de MS, esto podría aparecer como un error esporádico, y por lo tanto ser una perra para depurar.
Versión corta : asegúrese de que las referencias a proyectos dentro de la solución estén enumeradas como ProjectReference y no solo como referencia . Haga esto agregando la referencia en la pestaña Solución en lugar de buscar y seleccionar el archivo DLL.
Vea el orden de creación de una solución incorrecta al usar MSBuild.exe en el Blog de Visual Studio:
Siga este principio: ¡no utilice dependencias expresadas en el archivo de la solución en absoluto! Es mejor expresar las dependencias en el archivo que tiene la dependencia: en su lugar, colocar una referencia del proyecto en el proyecto. En nuestro ejemplo, eso sería una referencia de proyecto de B a C.
Es posible que no haya hecho eso antes porque no quería hacer referencia al objetivo de la referencia del proyecto, sino simplemente ordenar la compilación. Sin embargo, en 4.0 puede crear una referencia de proyecto que solo ordena la compilación sin agregar una referencia. Se vería así: tenga en cuenta el elemento de metadatos, y todo esto está dentro de una etiqueta
<ItemGroup>
por supuesto:
<ProjectReference Include="foo.csproj"> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference>
Tenga en cuenta que debe agregar el elemento secundario con un editor de texto: Visual Studio puede agregar una referencia de proyecto, pero no expone la IU para estos metadatos.
También puedo limpiar eliminando la dependencia en el archivo de la solución, eliminando líneas innecesarias como esta, su GUID será diferente, pero use el cuadro de diálogo VS y hará el trabajo ...