2017-05-09 12 views
4

在我的build.sbt中,我希望有一個輸入參數的任務,在我的代碼中調用main方法,但是我希望在調用方法之前先解析參數如何將輸入解析器與fullRunInputTask結合?

這是InputKey定義:

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

解析器我想使用:

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\"") 
} 

然後我知道,輸入參數傳遞給main方法我需要使用fullRunInputTask與InputKey參數化上面定義:

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

現在,我怎麼能結合的C全部爲fullRunInputTask,使用databaseTaskParser(在給出錯誤的一組參數時顯示錯誤)甚至在之前調用main方法?

回答

1

好吧,我自己找到了一個方法。

最重要的這裏的事情是我需要使用runTask代替fullRunInputTask的,但我需要爲了使用解析器包裝在一個動態輸入任務。然後我需要evaluate以獲得我的inputKeyInputTask值。

所以實際任務的定義是:

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

現在我還需要修改解析器不會返回一個元組,但列表或序列,但如果通過則params的權數仍然驗證。我做到了,像這樣:

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\"") 
} 

而且這樣做的伎倆:sbt clearDatabase如果給予零個或兩個參數,並運行在my.code.ClearDatabaseTaskmain方法通過所有PARAMS如果一個或三個給出,而無需額外的失敗在該方法內驗證。