如何防止 PlantUML 创建错误图像?
How prevent PlantUML from creating error images?
当 PlantUML 控制台工具在图表中遇到语法错误时,它会生成一个带有错误回溯的图像,如下所示:
有没有办法禁止生成错误图像并可能将回溯输出到 stderr 中?
我使用 PlantUML CLI 从多个源文件生成图像,如下所示:
$ plantuml diag1.puml diag2.puml diag3.puml
其中一些图表可能有语法错误,我需要跳过错误的部分。
我可以解析 stderr 并从那里得到错误的图表名称,但这是最后的手段。我相信上述行为应该有一个本地选项。
更新 07.07.2021
自 Plantuml 版本 1.2021.8 以来,有一个新选项 -noerror
正是这样做的:跳过错误图表并将有关错误的信息写入 stderr。
$ plantuml -noerror diag1.puml diag2.puml diag3.puml
Error line 5 in file: diag2.puml
Some diagram description contains errors
只生成了两张图片。
专业提示:Plantuml 有一个很棒的 forum,创建者可以在几天内迅速响应所有问题并将更改推送到新版本。
旧答案
普通模式下好像不行,在-pipe
模式下可以。搜索的参数是 -pipeNoStderr
.
如果你运行 PlantUML 在控制台的管道模式下,你可以输入图表代码,在每个图表之后它会立即输出图像的二进制代码。您还可以在脚本中使用它在 stdin 中输入代码并在 stdout 中获取结果。
你应该 运行 plantuml 像这样:
$ plantuml -pipe -pipeNoStderr -pipedelimitor ___sep___
此处:
-pipe
表示以管道模式启动plantuml。它将接受 stdin 中的图表代码,立即处理它并 return 以二进制格式生成 stdout;
-pipeNoStderr
告诉 plantuml 不要渲染错误图像。相反,它将 return 文本格式的错误回溯;
-pipedelimitor
告诉 plantuml 如果您将多个图表源发送到管道中,则在图表之间添加分隔符。这样您就可以确定一张图片的结束位置和另一张图片的开始位置;
___sep___
是我选择的分隔符字符串,它可以是任何你喜欢的,但足够独特。
管道工作流迫使我完全重写生成图表的工具。 Python 中的具体示例超出了这个问题的范围,但一般步骤是:
- 收集您要渲染的所有图表源。
- 检查每个来源是否以
@startuml
开头并以 @enduml
结束(否则此类错误的来源可能会损坏相邻图表)。
- 将所有来源放入一个
string
变量中,用几个换行符分隔。
- 运行管道模式下的 Plantuml 子进程。
- 将组合的源字符串提供给它。
- 从 stdout 获取响应并用分隔符将其拆分(
___sep___
在我的例子中)
- 循环浏览结果列表并提醒用户有关以
ERROR
开头的元素,并以二进制格式保存不以 开头的元素。
This article 帮了大忙。它在 JavaScript 上有一个示例项目,可以异步解决问题(与我不同)。
当 PlantUML 控制台工具在图表中遇到语法错误时,它会生成一个带有错误回溯的图像,如下所示:
有没有办法禁止生成错误图像并可能将回溯输出到 stderr 中?
我使用 PlantUML CLI 从多个源文件生成图像,如下所示:
$ plantuml diag1.puml diag2.puml diag3.puml
其中一些图表可能有语法错误,我需要跳过错误的部分。
我可以解析 stderr 并从那里得到错误的图表名称,但这是最后的手段。我相信上述行为应该有一个本地选项。
更新 07.07.2021
自 Plantuml 版本 1.2021.8 以来,有一个新选项 -noerror
正是这样做的:跳过错误图表并将有关错误的信息写入 stderr。
$ plantuml -noerror diag1.puml diag2.puml diag3.puml
Error line 5 in file: diag2.puml
Some diagram description contains errors
只生成了两张图片。
专业提示:Plantuml 有一个很棒的 forum,创建者可以在几天内迅速响应所有问题并将更改推送到新版本。
旧答案
普通模式下好像不行,在-pipe
模式下可以。搜索的参数是 -pipeNoStderr
.
如果你运行 PlantUML 在控制台的管道模式下,你可以输入图表代码,在每个图表之后它会立即输出图像的二进制代码。您还可以在脚本中使用它在 stdin 中输入代码并在 stdout 中获取结果。
你应该 运行 plantuml 像这样:
$ plantuml -pipe -pipeNoStderr -pipedelimitor ___sep___
此处:
-pipe
表示以管道模式启动plantuml。它将接受 stdin 中的图表代码,立即处理它并 return 以二进制格式生成 stdout;-pipeNoStderr
告诉 plantuml 不要渲染错误图像。相反,它将 return 文本格式的错误回溯;-pipedelimitor
告诉 plantuml 如果您将多个图表源发送到管道中,则在图表之间添加分隔符。这样您就可以确定一张图片的结束位置和另一张图片的开始位置;___sep___
是我选择的分隔符字符串,它可以是任何你喜欢的,但足够独特。
管道工作流迫使我完全重写生成图表的工具。 Python 中的具体示例超出了这个问题的范围,但一般步骤是:
- 收集您要渲染的所有图表源。
- 检查每个来源是否以
@startuml
开头并以@enduml
结束(否则此类错误的来源可能会损坏相邻图表)。 - 将所有来源放入一个
string
变量中,用几个换行符分隔。 - 运行管道模式下的 Plantuml 子进程。
- 将组合的源字符串提供给它。
- 从 stdout 获取响应并用分隔符将其拆分(
___sep___
在我的例子中) - 循环浏览结果列表并提醒用户有关以
ERROR
开头的元素,并以二进制格式保存不以 开头的元素。
This article 帮了大忙。它在 JavaScript 上有一个示例项目,可以异步解决问题(与我不同)。