2015-11-08 14 views
0

我想定義它運行在那裏的任務是定義在同一模塊中定義MyMainClass一個任務,任務的命令行傳遞給它:在命令行參數中使用runTask(... mainClass ...)在inputTask中,:= vs << = or?

$ 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;試圖使用< < = 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文件提及< < =根本沒有。

回答

1

改寫成新風格(:=而不是< < =)。

這工作:

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 
} 

BTW直接在程序訪問的風格感覺.value的比我以前用的(我想這是SBT已經使用宏改寫之前),舊的方式很多概念比較簡單。