我想定义一个运行在定义任务的同一模块中定义的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。
答案 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之前)。