studio - ¿Cómo decide MSBuild si necesita reconstruir una biblioteca de C#o no?
no puedo agregar referencia en visual studio 2017 (3)
Las cosas es que cualquier heurística que pueda parecer plausible probablemente no lo corte. Y cuando le pide a su compilador (sistema de compilación) que produzca una salida, es mejor que garantice que la salida es lo que espera que sea.
Que yo sepa, MSBuild no hace esto. Siempre reconstruye (desde cero) toda la solución / proyecto. Sin embargo, cuando se invoca MSBuild desde dentro de Visual Studio, las unidades de compilación temporal se mantienen en la carpeta / obj de su proyecto. Vaciar esa carpeta es lo mismo que reconstruir.
Dicho esto, si el compilador o el sistema de compilación reutilizara las salidas, usaría sumas de comprobación del contenido real del archivo para determinar si una salida compilada se puede recuperar de algún otro lugar. Básicamente, esta es la única forma confiable en la que podría determinar si un archivo realmente necesita ser recompilado desde cero. Para su información, esto lo hace el compilador de Visual C # no MSBuild.
El atributo de "fecha de la última modificación" del sistema de archivos no sería un sistema cruzado consistente y, por lo tanto, no se usaría en última instancia para determinar si se debe construir con salida en caché o compilación desde cero.
¿Cómo decide MSBuild si necesita reconstruir una biblioteca (es decir, invocar csc), o no, cuando se ejecuta en un archivo de proyecto C #?
Me imagino (pero quiero confirmar):
- Si no hay un directorio de salida, reconstruir (duh :))
- Si un archivo de C # ha cambiado, reconstruir
- Si un archivo incluido marcado como copia siempre ha cambiado, reconstrúyalo
- ¿O es lo suficientemente inteligente como para no reconstruir, sino simplemente copiar el archivo a la salida existente?
- Si un archivo incluido marcado como copia si es más nuevo ha cambiado, reconstrúyalo
- La misma pregunta que arriba
MSBuild tiene funcionalidad incorporada para hacerlo.
Target tiene dos propiedades, Inputs
y Outputs
.
Cuando la Input
cambia o la Output
es más antigua o falta, se ejecuta el Target
.
Si busca en Microsoft.CSharp.targets (el archivo MSBuild para compilar proyectos de C #), el objetivo CoreCompile tiene un conjunto de Entradas y Salidas definido. Estos se utilizan para realizar la comprobación de dependencias para ver si CoreCompile debe ejecutarse. La lista de entradas incluye los archivos C #, los archivos de recursos, el ícono de la aplicación, el archivo de clave de nombre seguro y otras entradas personalizadas que puede definir.
Si tiene una solución y ejecuta MSBuild en ella con el registro de diagnóstico habilitado (parámetro de línea de comando / v: diag), puede ver este mensaje si las salidas están actualizadas:
Se omite el destino "CoreCompile" porque todos los archivos de salida están actualizados con respecto a los archivos de entrada.
El archivo de objetivos se encuentra en el directorio de .NET Framework ( C:/windows/Microsoft.NET/Framework/v3.5 or v4.0.30319
).