如何在Ammonite中添加参数运行SBT命令?
解决Ammonite中执行带-mem参数的SBT命令问题
我帮你理清楚这个问题哈~你遇到的错误是因为把sbt启动脚本的参数和SBT内部命令搞混了,Ammonite的%.sbt魔法方法是用来传递SBT内部命令的,但-mem 3000是给sbt启动程序本身的参数,不是SBT的命令,所以才会报错说-mem不是合法命令。
下面给你两种正确的实现方式:
方式一:直接调用系统进程(推荐)
用Scala的sys.process库直接执行完整的sbt命令行,这样能正确区分启动参数和内部命令:
import sys.process._ // 字符串形式,简单直接 "sbt -mem 3000 clean compile docker:publishLocal" ! // 或者更安全的数组形式(避免路径含空格等特殊情况) Seq("sbt", "-mem", "3000", "clean", "compile", "docker:publishLocal") !
这里的!表示执行命令并返回退出码,如果想获取命令输出可以用!!(返回输出字符串)。
方式二:使用Ammonite的%魔法命令
如果习惯用Ammonite的魔法命令语法,需要把整个sbt命令作为参数传递,而不是用.sbt子方法:
// 字符串形式 %"sbt -mem 3000 clean compile docker:publishLocal"(pwd) // 或者数组形式 %("sbt", "-mem", "3000", "clean", "compile", "docker:publishLocal")(pwd)
这种方式本质也是调用系统进程,和方式一原理一致,只是用了Ammonite的语法糖简化写法。
为什么原来的写法不行?
你之前写的%.sbt("-mem 3000", 'clean, 'test)(pwd),其中.sbt方法会把所有传入的参数当作SBT的内部命令去执行,而-mem 3000并不是SBT内部的命令——它是启动sbt程序时的参数,所以SBT会把-mem当成无效命令抛出错误。
内容的提问来源于stack exchange,提问作者pme
相关产品推荐
相关产品推荐

