Как предотвратить создание изображений ошибок PlantUML?

#plantuml

Вопрос:

Когда консольный инструмент PlantUML обнаруживает синтаксическую ошибку на диаграмме, он генерирует изображение с обратным отслеживанием ошибок, как показано ниже:

Пример изображения ошибки

Есть ли способ отключить создание изображений ошибок и, возможно, вместо этого вывести обратную трассировку в stderr?


Я генерирую изображения из нескольких исходных файлов с помощью CLI PlantUML, как это:

 $ plantuml diag1.puml diag2.puml diag3.puml
 

Некоторые из этих диаграмм могут иметь неправильный синтаксис, мне нужно, чтобы неисправные были пропущены.

Я мог бы проанализировать stderr и получить оттуда имена неисправных диаграмм, но это последнее средство. Я считаю, что для упомянутого поведения должен быть собственный вариант.

Ответ №1:

Обновление 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 есть замечательный форум, где создатель оперативно реагирует на все вопросы и вносит изменения в новую версию в течение нескольких дней.


Старый ответ

Кажется, что это невозможно в обычном режиме, но в -pipe режиме это возможно. Искомый параметр есть -pipeNoStderr .

Если вы запустите PlantUML в режиме канала в консоли, вы можете ввести код диаграммы, и после каждой диаграммы он сразу же выведет двоичный код для изображения. Вы также можете использовать его в сценариях для ввода кода в stdin и получения результатов в stdout.


Вы должны запустить plantuml вот так:

 $ plantuml -pipe -pipeNoStderr -pipedelimitor ___sep___
 

Здесь:

  • -pipe означает запуск plantuml в режиме трубы. Он примет код диаграммы в формате stdin, немедленно обработает его и вернет результат в формате stdout в двоичном формате;
  • -pipeNoStderr говорит plantuml не отображать изображения с ошибками. Вместо этого он вернет трассировку ошибок в текстовом формате;
  • -pipedelimitor указывает plantuml добавить разделители между диаграммами, если вы отправляете в канал несколько источников диаграмм. Таким образом, вы можете определить, где заканчивается одно изображение и начинается другое;
  • ___sep___ это строка, которую я выбрал для разделителя, она может быть любой, какой вам нравится, но достаточно уникальной.

Рабочий процесс трубы заставил меня полностью переписать наш инструмент, который генерирует диаграммы. Конкретные примеры на Python выходят за рамки этого вопроса, но общие шаги были:

  1. Соберите все источники диаграмм, которые вы хотите отобразить.
  2. Убедитесь, что каждый источник начинается @startuml и заканчивается @enduml (в противном случае такой неисправный источник может повредить соседние диаграммы).
  3. Поместите все источники в одну string переменную, разделенную несколькими новыми строками.
  4. Запустите подпроцесс Plantuml в режиме канала.
  5. Передайте ему объединенную исходную строку.
  6. Получите ответ от stdout и разделите его разделителем ( ___sep___ в моем случае)
  7. Циклически просматривайте список результатов и предупреждайте пользователя об элементах, которые начинаются с ERROR и сохраняют в двоичном формате элементы, которые этого не делают.

Эта статья оказала мне большую помощь. У него есть пример проекта на JavaScript, который решает проблему (в отличие от меня) асинхронно.