Diferencia entre reconstrucción y limpieza + compilación en Visual Studio

Respuestas:

308

Reconstruir = Limpiar + Construir (generalmente)

Detalles notables:

  1. Para una solución multiproyecto, la "solución de reconstrucción" realiza una "limpieza" seguida de una "compilación" para cada proyecto (posiblemente en paralelo). Mientras que una "solución limpia" seguida de una "solución de compilación" primero limpia todos los proyectos (posiblemente en paralelo) y luego construye todos los proyectos (posiblemente en paralelo). Esta diferencia en la secuencia de eventos puede volverse significativa cuando las dependencias entre proyectos entran en juego.

  2. Las tres acciones corresponden a los objetivos de MSBuild. Por lo tanto, un proyecto puede anular la acción Reconstruir para hacer algo completamente diferente.

conde
fuente
2
¿Entonces estás diciendo que Reconstruir es exactamente lo mismo que Limpiar seguido de una Generación ? Eso es algo de lo que pensé, pero no estaba seguro.
Jim McKeeth el
43
Excepto Reconstruir limpia y reconstruye cada proyecto uno por uno. Clean + Build los limpia a todos y luego los construye a todos. Hace la diferencia principalmente si hace clic por accidente :)
Eugene
25
Excepto por la falta de garantía de que son lo mismo. Vea la respuesta de JaredPar a continuación, que combinada con la de Earl es la imagen completa. Debido a que Reconstruir realiza cada proyecto por turnos, puede tener un "caso de esquina" cuando su información de dependencia está desordenada y obtiene un proyecto de compilación fuera de orden de B usando el antiguo proyecto A y luego reconstruye A, luego reconstruye C. etc. A Solución completa La limpieza seguida de una solución completa detectará esta situación mientras que una reconstrucción no. Entonces, cuanto más paranoico y cansado estés, más deberías favorecer hacia Clean y Build.
Jason Harrison el
14
Esto no es verdad. He tenido un proyecto donde Clean + Build tuvo éxito, y Reconstruir devolvió errores de compilación (referencias de archivos circulares). Entonces no son 100% iguales.
Yaakov Ellis
2
Tal vez desde esta publicación las cosas han cambiado, pero hay una explicación de por qué Reconstruir no es (¿ya no?) Lo mismo que limpiar + construir stackoverflow.com/questions/3095901/…
Dave
163

Earl tiene razón que el 99% del tiempo Reconstruir = Limpiar + Construir.

Pero no se garantiza que sean lo mismo. Las 3 acciones (reconstruir, construir, limpiar) representan diferentes objetivos de MSBuild. Cada uno de los cuales puede ser anulado por cualquier archivo de proyecto para realizar acciones personalizadas. Por lo tanto, es completamente posible que alguien anule la reconstrucción para realizar varias acciones antes de iniciar una construcción limpia + (o eliminarlas por completo).

Es casi un caso de esquina, pero lo señala debido a las discusiones de comentarios.

JaredPar
fuente
Si agrega acciones de compilación que mueven archivos .dll a una nueva ubicación, puede obtener resultados de compilación "malos" simplemente haciendo una reconstrucción. Si combina un proyecto vb.net y c #, las cosas empeorarán aún más, los diseñadores de formularios rotos y no trabajarán.
CodingBarfield
+1 Tenga en cuenta también que el comportamiento de reconstrucción no parece ser coherente en todos los idiomas con respecto a las dependencias: stackoverflow.com/questions/12163080/…
lesscode
1
El 99% del tiempo se sobreestima enormemente.
Rhyous
58

Definamos la implementación de reconstrucción predeterminada en términos de implementaciones de limpieza y compilación predeterminadas:

  1. Por proyecto: Proyecto de reconstrucción = Proyecto limpio + Proyecto de construcción.

  2. Por solución: Reconstruir sln = proyecto foreach en sln (proyecto limpio + proyecto de compilación).

Tenga en cuenta que debido a las diferencias en el orden de ejecución, Reconstruir sln no es lo mismo que (Clean sln + Build sln) = (foreach project en sln Clean project) + (foreach project en sln Build project). Además, este "foreach" puede ejecutarse simultáneamente, por lo que se permite ejecutar diferentes tareas simultáneamente en los dos escenarios.

Supongamos que tiene un sln que contiene proj1, proj2 y proj3.

  • Reconstruir sln = (Clean proj1 + Build proj1) & (Clean proj2 + Build proj2) & (Clean proj3 + Build proj3)

  • Clean Sln + Build Sln = (Clean proj1 & Clean proj2 & Clean proj3) + (Build proj1 & Build proj2 & Build proj3)

+ significa serial y significa concurrente.

Por lo tanto, si las dependencias del proyecto no están configuradas correctamente, existe la posibilidad de que cuando ejecute Rebuild sln, algunos de sus proyectos se vinculen a una biblioteca obsoleta. Esto se debe a que no se garantiza que todas las limpiezas finalicen antes de que comience la primera compilación. Si ejecuta Clean sln + Build sln, le darán un error de enlace y se lo harán saber de inmediato, en lugar de darle una aplicación con un comportamiento extraño.

Trucha.Z
fuente
77
Esta es la respuesta más exacta, ya que explica por qué a veces no pude reconstruir, pero pude limpiar + construir.
Toan Nguyen
11

De http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm , (solo busqué en Google):

Compilar significa compilar y vincular solo los archivos de origen que han cambiado desde la última compilación, mientras que Reconstruir significa compilar y vincular todos los archivos de origen independientemente de si han cambiado o no. Construir es lo normal y es más rápido. A veces, las versiones de los componentes de destino del proyecto pueden desincronizarse y la reconstrucción es necesaria para que la compilación sea exitosa. En la práctica, nunca necesitas limpiar.

Build or Rebuild Solution construye o reconstruye todos los proyectos en su solución, mientras que Build or Rebuild construye o reconstruye el proyecto StartUp, "hola" en la captura de pantalla anterior. Para configurar el proyecto de inicio, haga clic derecho en el nombre del proyecto deseado en la pestaña Explorador de soluciones y seleccione Establecer como proyecto de inicio. El nombre del proyecto ahora aparece en negrita. Dado que las soluciones de tarea generalmente tienen un solo proyecto, la solución de construcción o reconstrucción es efectivamente la misma que la de construir o reconstruir.

Compilar solo compila el archivo fuente que se está editando actualmente. Útil para verificar rápidamente si hay errores cuando el resto de sus archivos de origen están en un estado incompleto que evitaría una compilación exitosa de todo el proyecto. Ctrl-F7 es la tecla de acceso directo para Compilar.

Eduardo Mello
fuente
Al igual que Toan Nguyen, he experimentado que a veces Clean + Build Solution tiene éxito cuando falla una solución de reconstrucción (probablemente debido a dependencias entre proyectos), por lo que esta respuesta es engañosa, al menos en 2018.
Jon Coombs
4

De esta publicación de blog que el autor ha vinculado como comentario sobre esta pregunta :

¡¡¡En realidad no!!! No son iguales.

La diferencia está en la secuencia en que los proyectos se limpian y construyen. Digamos que tenemos dos proyectos en una solución. La limpieza y luego la compilación se realizarán en ambos proyectos y luego la compilación ocurrirá individualmente mientras se está reconstruyendo, el proyecto A se limpiará y luego se construirá después de que el proyecto B se limpiará y luego se construirá y así sucesivamente.

Prageeth godage
fuente