2016-08-01 9 views
2

Angenommen, ich habe zwei Aufgaben, doStart und doStop, und ich möchte eine vorhandene Aufgabe (z. B. test) in diesen Aufgaben umbrechen. Folgendes funktioniert nicht:Verpacken einer vorhandenen Aufgabe mit benutzerdefinierten Aufgaben

test := Def.sequential(doStart, test, doStop).value 

Es schlägt zur Laufzeit mit einem Fehler über nicht aufgelöste Einstellschlüssel fehl. Ich denke, das ist eigentlich ganz natürlich ist, weil Def.sequential in eine verschachtelte Sequenz von Def.taskDyn erweitert, und da die test Aufgabe in der Mitte Aufgabe verwiesen wird, sein „neuer“ Wert angefordert wird, aber in diesem Moment ist es offenbar nicht verfügbar:

test := Def.taskDyn { 
    doStart.value 
    Def.taskDyn { 
    test.value 
    doStop 
    } 
}.value 

Wenn ich führen eine vorübergehende Aufgabe und wickeln sie es statt test:

val _testOriginal = taskKey[Unit]("Used for wrapping.") 

_testOriginal := test.value 

test := Def.sequential(doStart, _testOriginal, doStop) 

dann nicht den Fehler, den ich bekomme, aber ich bekommen, was wie eine unendliche Schleife scheint da doStart dann ausgeführt wird, aber SBT hängt unbegrenzt ohne das OriginalaufrufenAufgabe. Dies erscheint auch natürlich, weil _testOriginal von dem aktuellen Wert test, nicht der ursprünglichen abhängt.

Die einzige „Lösung“ ich jetzt sehen, ist meine eigene Aufgaben wie testWrapped genannt einzuführen, testQuickWrapped usw. und den Benutzer anweisen meiner bauen sie statt test/testQuick/etc zu verwenden., Aber ich wirklich don‘ Ich will es tun. Wie umgehe ich eine bestehende Aufgabe?

Antwort

1
test := doStop.dependsOn(test.dependsOn(doStart)).value 

Obwohl FYI, im Fall von Tests, könnten Sie doStart und doStop nicht Aufgaben machen, sondern Vanille-Funktionen, und verwenden Sie die mitgelieferten testOptions Möglichkeiten.

testOptions in Test += Tests.Setup(() => ...) 

testOptions in Test += Tests.Cleanup(() => ...) 
+0

In der Tat scheint der 'dependsOn' Trick zu funktionieren, danke! Ist es möglich, das gleiche mit 'testQuick' /' testOnly' zu tun, die Input-Aufgaben sind? –