Ehundu 0.13.0
La compilación incremental sale del proceso. Hasta ahora solo ehundu servir compilaba de forma incremental, porque lo que recuerda una compilación no sobrevivía al proceso que la hizo; quien incrustaba el motor en un proceso web, como un panel de edición, tenía que compilar el sitio entero en cada guardado. La clase nueva CompiladorIncrementalEnProceso (compilar, avanzar y olvidar, docs/biblioteca.md (se abre en una pestaña nueva)) guarda lo que recuerda en .ehundu/memoria.bin, dentro del proyecto, y la siguiente compilación, aunque sea de otro proceso, lo aprovecha: en el sitio más grande de los de prueba, 1.204 páginas, cambiar una página rehace una y tarda unos 3 s, frente a los 35-45 s de una compilación completa. El resultado es siempre el de una compilación completa: los mismos ficheros y los mismos avisos.
Y se puede repartir en llamadas. avanzar($proyecto, $segundos) rehace páginas hasta agotar el presupuesto y guarda lo hecho; la llamada siguiente sigue. No hace falta un estado aparte, como en la compilación por lotes: una memoria con la mitad de las páginas es una memoria a la que le faltan páginas, y el plan de la incremental rehace las que faltan y aprovecha las que valen, también si el proyecto cambia entre dos llamadas. El Informe de la llamada que termina cuenta la compilación entera, no solo su parte. Los lotes de la 0.12 siguen como estaban, para quien quiera repartir una compilación completa sin guardar nada del sitio.
La memoria se ignora sin error si no vale. Si falta, está dañada o cortada, la escribió otra versión de la memoria o del motor (lleva una huella del tamaño y la fecha de su código, así que actualizar el motor hace que la primera compilación sea entera), o es de otro proyecto, se hace una compilación completa. Solo se guarda cuando una llamada sale bien, y no se vuelve a escribir si no se ha rehecho ninguna página. Una llamada que llega mientras otra está compilando el mismo proyecto no la estropea: avanzar devuelve ocupado() y compilar espera. La memoria pesa del orden de salida/ más lo leído (97 MB en el sitio de 1.204 páginas) y el proceso que la carga necesita unos 350 MB en ese sitio; .ehundu/ lleva su propio .gitignore, y se puede borrar cuando se quiera (docs/formato.md (se abre en una pestaña nueva), §10.5, decisión 126; docs/compilacion.md (se abre en una pestaña nueva)).
Los sitios de la 0.12 compilan igual: no cambia nada que no use la clase nueva, y la orden ehundu no la usa. Compilados desde cero con la 0.12.0 y con esta, los veintitrés sitios de prueba (PDF incluidos) dan los mismos ficheros, uno a uno; y compilados con la incremental persistida, repartida en llamadas y después sin cambios, dan lo mismo que de golpe.
Esta versión en GitHub (se abre en una pestaña nueva), con el ehundu.phar.