2015-11-10 2 views
3

Может ли кто-нибудь помочь мне создать задачу SBT, которая может поддерживать аргументы свойств, подобные из командной строки?SBT InputKey с аргументами свойств

lazy val myTask = inputKey[Unit]("my task") 
myTask := { 
    if (directoryOpt.isEmpty) // directoryOpt comes from an optional command line argument: directory="~/downloads" 
     fullRunInputTask(inputKey, Compile, "example.MyTaskClass") 
    else 
     fullRunInputTask(inputKey, Compile, "example.MyTaskClass", directoryOpt.get) 
} 

Если задача может быть запущена из командной строки, как:

sbt myTask directory="~/downloads" 

Я прочитал СБТ док в http://www.scala-sbt.org/0.13/docs/Input-Tasks.html. Но это только объясняет, как создать парсер задач, такой как sbt myTask option1 option2, который не совсем соответствует моей потребности.

UPDATE: Я использовал решение jazmit, так как это было простое изменение. Это работает хорошо! Я также попробую решение Mariusz и его обновление.

ответ

1

Вы можете использовать свойства окружающей среды для достижения желаемого результата.

из командной строки, установите свойство следующим образом:

sbt myTask -Ddirectory="~/downloads" 

Из задачи, вы можете получить значение следующим образом:

val directory = System.getProperty("directory"); 

Если вы хотите сделать что-то более твердое с проверка синтаксиса, завершение табуляции и т. д., вы можете определить задание ввода как подробно here. Если вам нужен синтаксис свойство = значение, вы можете определить это с помощью parser combinator library, например:

import sbt.complete.DefaultParsers._ 
val myArgs: Parser[String] = "directory=" ~> StringEscapable 
2

Вы можете использовать project/Build.scala вдоль вашего build.sbt с входами. Вы также можете использовать Commands вместо задач. Ниже приведен пример:

import sbt._ 
import Keys._ 

object CustomBuild extends Build { 

def myTask = Command.args("myTask", "<name>"){ (state, args) => 

    val argMap = args.map { s => 
    s.split("=").toList match { 
     case n :: v :: Nil => n -> v 
    } 
    }.toMap 

    //println(argMap) //to see all argument pairs 
    //react on name in params list 
    println("Hi "+ argMap.getOrElse("name", "Unknown")) 

    state //Command can modify state, so you must to return it. 
    } 
} 

Теперь вы должны добавить эту команду для вас проект, в build.sbt добавить

commands += myTask 

Теперь вы можете использовать:

> sbt "myTask name=Mario" 
> Hi Mario 
> sbt myTask 
> sbt Hi Unknown 

Надежда, это поможет вам!
Дополнительная информация о командах: you can find here

Смежные вопросы