2017-09-27 1 views
1

Ich habe folgende Build-SystemWarum ist Shakes Fortschrittsschätzung für dieses einfache Build-System sehr falsch?

module Main where 

import Development.Shake 

main :: IO() 
main = shakeArgs shakeOptions $ do 

    "a" %> \out -> do 
    need ["a.in"] 
    cmd_ "sleep" "10" 
    cmd "touch" [out] 

, die ich mit stack build bauen und laufen mit stack exec myShake -- --progress a.

Wenn ich einen sauberen Build und als touch a.in und wieder ausführen, zeigt mir Shake sehr falsche Fortschrittsvorhersagen. Manchmal sagt es 1000 Minuten und mehr voraus.

(Da ich alle 5 Sekunden eine Fortschrittsvorhersage in der Titelleiste meines Terminals erhalte, wenn ich das richtig verstanden habe, rede ich hier nur über die erste Fortschrittsvorhersage, da dies die einzige ist, die ich mit diesem Buildsystem bekomme Beispiel.)

Ich benutze lts-9.6 mit Stapel und schütteln Version 0.16 (via Git + einen Eintrag in Paketen in stack.yaml).

Antwort

1

Die Dokumentation, wie Fortschritt Arbeiten können bei progressDisplay finden:

Die aktuelle Implementierung ist die Zeit vorherzusagen verbleibende (basierend auf timeTodo) und die bereits geleistete Arbeit (timeBuilt). Der Prozentsatz wird dann als remaining/(done + remaining) berechnet, während die verbleibende Zeit durch Skalierung, die bei der beobachteten Arbeitsrate in diesem Build verbleibt, ungefähr done/time_elapsed berechnet wird.

Im Fall von sehr kurzen Build-Systemen, die nur einer einzigen Sache, die Arbeit-Rate tun ist in der Regel Müll - so dass Sie noch die Arbeit Skalierung am Ende mit einer Zufallszahl (was wahrscheinlich auf 10s vorhergesagt wird) (vermutlich eine große Zahl, um 1000m zu bekommen).

Die Idee der Änderung der Arbeitsgeschwindigkeit ist, dass Sie manchmal auf einem Laptop im Akkubetrieb versus Netzstrom sind, und manchmal passieren Sie verschiedene Parallelitätsflags. Es ist durchaus möglich, dass Shake mindestens eine oder mehrere Threads als Annäherung an die Arbeitsgeschwindigkeit verwendet, zumindest um es zu beginnen.

+0

Ich habe ein Ticket zur Untersuchung erhoben: https://github.com/ndmitchell/shake/issues/537 –

1

Es sieht so aus, als ob die erste Fortschrittsschätzungsnachricht im Allgemeinen nutzlos ist. Für nicht triviale Build-Systeme sollte dies kein Problem sein, da sie länger als fünf Sekunden dauern.

Mit diesem Build-System und --progress=1 ein, dass die erste Schätzung Weise zu sehen ist, aber die andere besser:

module Main where 

import Development.Shake 

main :: IO() 
main = shakeArgs shakeOptions $ do 
    mapM_ (\i -> 
    ("a." ++ show i) %> \out -> 
     do 
     need [out ++ ".in", "a." ++ show (i-1)] 
     cmd_ "sleep" "1" 
     cmd "touch" [out]) 
    [1 .. 10] 

    "a.0" %> \out -> do 
    need ["a.0.in"] 
    cmd_ "sleep" "1" 
    cmd "touch" [out] 

Um dies zu testen, Sie

for i in $(seq 0 10); do touch a.$i.in; done 
tun müssen

im Arbeitsverzeichnis verwenden Sie mit diesem Beispiel-Build-System.

Verwandte Themen