#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 выходят за рамки этого вопроса, но общие шаги были:
- Соберите все источники диаграмм, которые вы хотите отобразить.
- Убедитесь, что каждый источник начинается
@startuml
и заканчивается@enduml
(в противном случае такой неисправный источник может повредить соседние диаграммы). - Поместите все источники в одну
string
переменную, разделенную несколькими новыми строками. - Запустите подпроцесс Plantuml в режиме канала.
- Передайте ему объединенную исходную строку.
- Получите ответ от stdout и разделите его разделителем (
___sep___
в моем случае) - Циклически просматривайте список результатов и предупреждайте пользователя об элементах, которые начинаются с
ERROR
и сохраняют в двоичном формате элементы, которые этого не делают.
Эта статья оказала мне большую помощь. У него есть пример проекта на JavaScript, который решает проблему (в отличие от меня) асинхронно.