【问题标题】:Using runTask(...mainClass...) inside inputTask with command line args, := vs <<= or?在 inputTask 中使用 runTask(...mainClass...) 和命令行参数,:= vs <<= or?
【发布时间】:2016-02-09 04:56:58
【问题描述】:

我想定义一个任务,它运行在定义任务的同一模块中定义的 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().parsed 与 taskKey 一起使用会给我编译错误,明确指出我必须改用 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 文档提到

【问题讨论】:

    标签: sbt


    【解决方案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
    }
    

    顺便说一句,以程序风格直接访问 .value 在概念上比我以前使用的旧方法要简单得多(我猜那是在使用宏重写 SBT 之前)。

    【讨论】:

      猜你喜欢
      • 2014-08-03
      • 2012-09-01
      • 2013-04-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多