scala - 使用 sbt 构建凿子时,如何关闭进度条等以使输出干净?
问题描述
使用 sbt 构建凿子时,作为批处理运行时,如何关闭进度条等,以便输出像大多数编译器一样干净?
也就是说,我喜欢在 makefile 中使用 sbt 构建凿子,如下所示:
${VLOG_DIR}/${NAME}.v: ${NAME}.scala
setsid sbt \
'runMain ${NAME}.${NAME} --top-name ${NAME} --target-dir ${VLOG_DIR}'
然而 sbt/scala/chisel 喜欢尝试生成某种进度条,同时构建发出终端转义码以尝试更新输出。当在我的 shell 中运行时,它不能很好地工作,但是当在 emacs 中运行时,它会造成巨大的混乱:
make
setsid sbt \
'runMain HelloWorld.HelloWorld --top-name HelloWorld --target-dir Gen_HelloWor\
ld.verilog_dir'
^[[0m[^[[0m^[[0minfo^[[0m] ^[[0m^[[0mLoading project definition from /home/user/h\
ello-chisel/project^[[0m
^[[2K
^[[2K
^[[2K
^[[2K
^[[2K
^[[5A^[[2K
^[[2K
^[[2K
^[[2K
^[[2K
^[[2K | => hello-chisel-build / update 0s
^[[6A^[[2K
^[[2K
特别是当有错误信息时:
^[[2K
^[[2K
^[[2K | => hello-chisel / Compile / compileIncremental 1s
^[[6A^[[2K^[[0m[^[[0m^[[31merror^[[0m] ^[[0m^[[0m/home/user/hello-chisel/HelloWor\
ld.scala:46:17: overloaded method value apply with alternatives:^[[0m
^[[2K
如何关闭所有这些并获得具有干净错误消息的正常输出?
解决方案
简短的回答
根据sbt FAQ传递-no-colors
到sbt
命令行
:
$ sbt -no-colors 'test:runMain gcd.GCDMain'
尽管名称为“无颜色”,但它会抑制所有终端转义内容,包括进度条。
其他选择
该选项也可以拼写--no-colors
(两个连字符),这就是它在sbt --help
(and sbt -help
) 的输出中的显示方式。
可以通过传递-Dsbt.log.noformat=true
给sbt
(或者java
如果直接调用它)来实现相同的效果,如this answer所示:
$ sbt -Dsbt.log.noformat=true 'test:runMain gcd.GCDMain'
也可以通过将JAVA_OPTS
环境变量设置为-Dsbt.log.noformat=true
:
$ JAVA_OPTS=-Dsbt.log.noformat=true sbt 'test:runMain gcd.GCDMain'
如果您正在使用sbt-launch.jar
,那么您必须使用-D
开关,因为-no-colors
在该上下文中无法识别(sbt
shell脚本是识别的-no-colors
):
$ java -jar ~/opt/sbt-1.3.4/bin/sbt-launch.jar -Dsbt.log.noformat=true 'test:runMain gcd.GCDMain'
最后,当sbt
检测到它的 stdout 不是 TTY 时,它会抑制颜色输出:
$ sbt 'test:runMain gcd.GCDMain' | cat
不过,这在 Makefile 中不是一个好的选择,因为您失去了sbt
(没有进一步的恶作剧)的退出状态。
可惜sbt
不尊重。_NO_COLOR
无论如何,凿子输出有一些颜色
使用Chisel时,例如chisel template,即使使用-no-colors
,一些终端转义码仍会出现在输出中:
$ sbt -no-colors 'test:runMain gcd.GCDMain' | cat -tev
[info] Loading settings for project chisel-template-build from plugins.sbt ...$
[info] Loading project definition from /home/scott/wrk/learn/chisel/chisel-template/project$
[info] Loading settings for project chisel-template from build.sbt ...$
[info] Set current project to chisel-module-template (in build file:/home/scott/wrk/learn/chisel/chisel-template/)$
[warn] Multiple main classes detected. Run 'show discoveredMainClasses' to see the list$
[info] running gcd.GCDMain $
[^[[35minfo^[[0m] [0.001] Elaborating design...$
[^[[35minfo^[[0m] [1.064] Done elaborating.$
Total FIRRTL Compile Time: 512.0 ms$
file loaded in 0.114380184 seconds, 22 symbols, 17 statements$
[^[[35minfo^[[0m] [0.001] SEED 1581769687441$
test GCD Success: 168 tests passed in 1107 cycles in 0.047873 seconds 23123.91 Hz$
[^[[35minfo^[[0m] [0.037] RAN 1102 CYCLES PASSED$
[success] Total time: 3 s, completed Feb 15, 2020 4:28:09 AM$
注意[^[[35minfo^[[0m]
接近尾声的输出。发生这种情况是因为chiselFrontend/src/main/scala/chisel3/internal/Error.scala无条件地打印颜色转义序列(参见tag
函数),这可以说是 Chisel 中的一个错误,因为它的输出显然意味着看起来类似于sbt
输出。
设置的效果
在您的示例 Makefile 中,您sbt
通过setsid
. 据我所知,我所说的一切都同样适用于这种情况。但是,您可能想要传递--wait
给它,setsid
所以它会在退出之前等待sbt
完成。在我的测试中,setsid
仅当 stdout 不是 TTY 时才会隐式等待,但我怀疑您是否真的想要隐藏的可变性。
推荐阅读
- go - 在 Go 中返回无效结构的惯用方式
- javascript - scaleQuantize,基于高度的彩条
- python - 在 python3 上使用 pip 进行正则表达式安装时遇到错误
- security - 我们可以认为非插件基于网络的加密钱包是安全的吗?
- c# - Azure AD - 使用 EFCore 跟踪用户对象
- javascript - JavaScript - 解构对象中的默认值作为参数传递给箭头函数
- r - kable col.names 和 header 中的文本下标
- algorithm - 估值数据集的意义何在
- ado.net - 如何在不更改 BindingSource 位置的情况下保存脏记录
- python - 是否可以为 CountVectorizer 创建与 Scikit-learn 中的 DictVectorizer 可用的等效“限制”方法?