2017-05-09 5 views
4

In meiner build.sbt möchte ich eine Aufgabe mit Eingabeparametern haben, die eine main Methode in meinem Code aufrufen, aber ich möchte die Parameter vor dem Aufruf der Methode geparst haben.Wie kombiniere ich Eingabe-Parser mit fullRunInputTask?

Dies ist die InputKey Definition:

val clearDatabase = inputKey[Unit]("Clear database, arguments: endpoint user password") 

Ein Parser ich verwenden möchte:

val databaseTaskParser = sbt.Def.spaceDelimited("endpoint username password").map(_.toList).map { 
    case List(endpoint) => (endpoint, "", "") 
    case List(endpoint, username, password) => (endpoint, username, password) 
    case _ => 
    sys.error("Supported arguments: \"endpoint\" or \"endpoint username password\"") 
} 

Und dann weiß ich, dass Eingabeargumente an die Haupt-Methode, die ich verwenden müssen passieren fullRunInputTask mit dem InputKey parametrisiert oben definiert:

fullRunInputTask(clearDatabase, Compile, "my.code.ClearDatabaseTask") 

Nun, wie kann ich die c kombinieren alle zu fullRunInputTask mit der databaseTaskParser (um Fehler anzuzeigen, wenn ein falscher Parametersatz angegeben wird) noch vor die main Methode heißt?

Antwort

1

Okay, ich habe selbst einen Weg gefunden.

Das Wichtigste war, dass ich hier runTask statt fullRunInputTask, verwenden müssen, aber ich brauche es in einer dynamische Eingabeaufgabe zu wickeln, um den Parser zu verwenden. Und dann muss ich evaluate es um den InputTask Wert für meine inputKey bekommen.

So ist die eigentliche Aufgabe Definition lautet:

clearDatabase := Def.inputTaskDyn { 
    runTask(Compile, "my.code.ClearDatabaseTask", databaseTaskParser.parsed:_*) 
}.evaluated 

nun den Parser ändern Ich muss auch ein Tupel nicht zurück, sondern eine Liste oder eine Sequenz, aber immer noch überprüfen, ob die richtige Anzahl von params übergeben wird. Ich habe es etwa so:

val databaseTaskParser = sbt.Def.spaceDelimited("endpoint username password").map(_.toList).map { 
    case args if List(1, 3).contains(args.length) => args.padTo(3, "") 
    case _ => 
     sys.error("Supported arguments: \"endpoint\" or \"endpoint username password\"") 
} 

Und das funktioniert der Trick: sbt clearDatabase schlägt fehl, wenn null oder zwei Parameter gegeben und führt die main Methode in my.code.ClearDatabaseTask alle params vorbei, wenn ein oder drei gegeben sind, ohne die Notwendigkeit für zusätzliche Überprüfung innerhalb dieser Methode.