【问题标题】:How to pass command line args to program in SBT 0.13.1?如何将命令行参数传递给 SBT 0.13.1 中的程序?
【发布时间】:2013-12-15 15:17:52
【问题描述】:

我刚刚切换到 SBT 0.13.1 并且 arg 处理发生了变化,或者存在错误。这是我正在测试的内容(名为 sbt-test.scala):

#!/bin/sh
SBT_0_13_0="/path/to/sbt-launch-0.13.0.jar"
SBT_0_13_1="/path/to/sbt-launch-0.13.1.jar"
SBT="$SBT_0_13_1"
exec java $JAVA_OPTS -Dsbt.main.class=sbt.ScriptMain -jar "$SBT" $0 "$@"
!#

/***
scalaVersion := "2.10.3"

libraryDependencies ++= Seq(
  "com.typesafe" % "config" % "1.0.0"
)
*/

import com.typesafe.config.{ConfigFactory, Config}

println(s"Args: ${args mkString ", "}")

val cfg = ConfigFactory.parseString(
  """
    |credentials {
    |  user = someone
    |  pass = s3cr3t
    |}
  """.stripMargin)

println(cfg getString "credentials.user")

当我运行./sbt-test.scala --arg=val 时,出现以下错误:

[error] Expected ID character
[error] Not a valid command: arg
[error] arg=val

在 SBT 0.13.0 中使用相同的参数运行相同的脚本会产生预期的结果:

Args: --arg=val
someone

同样,如果我将该可执行脚本转换为实际的 SBT 项目并尝试运行 sbt run --flag 我会得到

[error] Not a valid command: flag (similar: iflast, last, alias)
[error] flag

【问题讨论】:

    标签: sbt


    【解决方案1】:

    请参阅Batch mode 上的文档:

    批处理模式

    你也可以在批处理模式下运行 sbt,指定一个空格分隔的 sbt 命令列表作为参数。对于带参数的 sbt 命令,将命令和参数作为一个参数传递给sbt,方法是用引号将它们括起来。例如,

    $ sbt clean compile "testOnly TestA TestB"
    

    在此示例中,testOnly 具有参数 TestATestB。命令将按顺序运行(cleancompile,然后是testOnly)。

    因此,如果您不希望 --flag 被解释为命令,则必须用 run 引用它:

    $ sbt "run --flag"
    

    sbt 脚本运行器

    Scripts, REPL, and Dependencies 中描述了脚本,这似乎是说除了 bash 引号之外您不需要额外的引号:

    java -Dsbt.main.class=sbt.ScriptMain -Dsbt.boot.directory=/home/user/.sbt/boot -jar sbt-launch.jar "$@"
    

    实际上,要使您的脚本正常工作,您需要在 $@ 周围使用另一组转义引号,如下所示:

    exec java $JAVA_OPTS -Dsbt.main.class=sbt.ScriptMain -jar "$SBT" $0 "\"$@\""
    

    如果这是从 0.13.1 开始的回归,你应该向 sbt 报告。

    【讨论】:

    • 让它作为脚本运行怎么样?这是问题的主要焦点。
    • 双引号仅适用于单个 arg。但是如果我有类似 ./sbt-test.scala --flag --arg=val 的东西,我会在第二个 arg 上得到一个错误。我要把它报告为一个错误
    猜你喜欢
    • 2016-10-25
    • 2013-07-12
    • 2011-05-20
    • 2015-10-30
    相关资源
    最近更新 更多