在inputTask中使用runTask(... mainClass ...)和命令行args,:= vs<< =或?

时间:2015-11-08 12:34:11

标签: sbt

我想定义一个运行在定义任务的同一模块中定义的MyMainClass的任务,将任务命令行传递给它:

$ sbt
> project myModule
> myKey2 someArgument
...compiles MyMainClass
...runs MyMainClass.main("someArgument")

没有命令行参数,这可行:

val myKey1 = taskKey[Unit]("myKey1")
lazy val myModule = project.settings(
    myKey1 <<= runTask(Compile, "MyMainClass", "mode1"),
    myKey1 <<= myKey1.dependsOn(compile in Compile)
)

但我无法使用命令行参数。尝试使用Def.spaceDelimited()。使用taskKey解析会给我编译错误,明确表示我必须使用inputKey;尝试使用&lt;&lt; = with inputKey也不编译;这编译但不起作用:

val myKey2 = inputKey[Unit]("myKey2")
lazy val myModule = project.settings(
    ...
    myKey2 := runTask(
        Compile, "MyMainClass", "mode2", 
        {
            val args = Def.spaceDelimited().parsed.head)
            // This line is executed, but MyMainClass.main() is not:
            System.err.println("***** args=" + args)
            args.head
        }
    ),
    myKey2 <<= myKey2.dependsOn(compile in Compile)
)

尝试SBT 0.13.7和0.13.9。请帮忙。谢谢。 :)

UPD。或者也许我这样做是完全错误的(已弃用)?我找不到SBT 0.13文档提及&lt;&lt; = at。

1 个答案:

答案 0 :(得分:1)

以新风格重写(:=而不是&lt;&lt; =)。

这有效:

myKey1 := {
    // Works without this line, but kept it for clarity and just in case:
    val _ = (compile in Compile).value
    runTask(Compile, "MyMainClass1", "mode1").value
},

myKey2 := {
    val _ = (compile in Compile).value
    runInputTask(Compile, "MyMainClass", "mode2").evaluated
}
直接访问.value的程序风格感觉在概念上比我过去使用的旧方法更简单(我猜这是在使用宏重写SBT之前)。