如何将命令行参数传递给SBT 0.13.1中的程序?
我刚切换到SBT 0.13.1,要么arg处理发生了变化,要么出现了bug。下面是我正在测试的内容(名为如何将命令行参数传递给SBT 0.13.1中的程序?,sbt,Sbt,我刚切换到SBT 0.13.1,要么arg处理发生了变化,要么出现了bug。下面是我正在测试的内容(名为sbt test.scala): 当我运行/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 test.scala
):
当我运行/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,将sbt命令的空格分隔列表指定为参数。对于采用参数的sbt命令,通过将命令和参数括在引号中,将它们作为一个参数传递给sbt
。比如说,
$ sbt clean compile "testOnly TestA TestB"
在本例中,testOnly
具有参数、TestA
和TestB
。命令将按顺序运行(clean
,compile
,然后testOnly
)
因此,如果您不想将--flag
解释为命令,则必须使用run:
$ sbt "run --flag"
脚本运行程序
中描述了脚本,这似乎表明除了bash引号之外,您不需要额外的引号:
实际上,要使脚本正常工作,您需要在$@
周围添加一组转义引号,如下所示:
exec java $JAVA_OPTS -Dsbt.main.class=sbt.ScriptMain -jar "$SBT" $0 "\"$@\""
如果这是从0.13.1开始的回归,您应该向sbt报告。让它作为脚本运行怎么样?这是问题的主要焦点。双引号只能用于单个arg。但是如果我有类似于./sbt-test.scala--flag--arg=val的内容,我会在第二个arg上得到一个错误。我要把它当作臭虫报告
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 "\"$@\""