Вопрос или проблема
У нас есть множество файлов .bicep
+ .bicepparam
, и иногда у нас появляются новые идеи о том, как их структурировать. Это влечет за собой изменения во многих файлах, чтобы применить новый подход.
Некоторые из этих изменений мы можем сделать с помощью замены текста, используя либо регулярные выражения, либо обычную замену. Однако некоторые изменения требуют немного больше логики.
Было бы идеально, если бы мы могли иметь скрипт, который может читать файл .bicep, выполнять над ним определенную логику, а затем записывать измененную версию обратно.
Псевдокод:
foreach (filepath in bicep_files)
bicep_model = read_bicep(filepath)
… здесь выполняется кастомная логика, вносятся изменения в модель …
write_bicep(bicep_model, filepath)
С ARM / JSON это просто – существует множество сериализаторов / десериализаторов JSON. Для bicep я не знаю таких библиотек / парсеров.
Возможные варианты, которые я рассмотрел:
- Использовать Bicep CLI для чтения bicep файла. К сожалению, у него нет команд для десериализации (парсинга) bicep файла. Он может компилировать в ARM/JSON, но тогда такие вещи, как комментарии и ссылки на переменные, теряются, что означает, что мы не можем вернуться назад в bicep.
https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/bicep-cli - Использовать интерфейс JSON-RPC для Bicep, который “позволяет программное взаимодействие со структурированным выводом”. К сожалению, в нём также нет методов для парсинга файла bicep в представление, пригодное для машинной обработки.
https://github.com/Azure/bicep/blob/main/src/Bicep.Cli/Rpc/ICliJsonRpcProtocol.cs - Расширение VS Code для bicep предоставляет богатую поддержку редактирования, так что предположительно оно под капотом парсит bicep файлы в представление, пригодное для машинной обработки. Не уверен, как это делается, и не знаю, как мы могли бы использовать это для скриптового редактирования.
https://github.com/Azure/bicep/tree/main/src/vscode-bicep - Сервер JSON-RPC взаимодействует с .NET-классами Bicep под капотом – возможно, мы можем сделать это тоже и таким образом достичь цели? Не уверен, как начать здесь.
https://github.com/Azure/bicep/blob/main/src/Bicep.Cli/Rpc/CliJsonRpcServer.cs
Ответ или решение
Теория
Работа с Azure Bicep часто требуют изменения и адаптации существующих Bicep шаблонов для соответствия новым требованиям и идеям структуры. Однако, как вы уже указали, основная сложность заключается в том, что Bicep не предоставляет встроенных средств для программного парсинга и редактирования Bicep файлов, в отличие от JSON, для которого существует множество библиотек сериализации и десериализации. Рассмотрим возможные подходы к решению этой задачи.
Пример
Начнем с краткого обзора возможных способов работы с Bicep файлами:
-
Bicep CLI: Это основная утилита для работы с Bicep файлами. Однако, она не поддерживает прямое парсирование Bicep файлов в программно-обрабатываемую форму. Конвертация в ARM-шаблоны ведет к потере некоторых аспектов, таких как комментарии и ссылки на переменные.
-
Интерфейс JSON-RPC: Хотя JSON-RPC интерфейс предоставляет возможность структурированного взаимодействия с Bicep файлами, он также не поддерживает функциональность, необходимую для полного парсинга Bicep файлов.
-
Расширение VS Code: Оно обеспечивает богатыми возможностями редактирования Bicep файлов и, вероятно, использует внутренние парсеры для работы с ними. Однако, встраивание этой функциональности в скрипты для автоматизированной обработки файлов может быть сложной задачей.
-
Библиотеки .NET: Возможно, наиболее перспективным путём является использование .NET классов, которые используются в JSON-RPC для обработки Bicep файлов. Хотя это требует определенных знаний о внутреннем устройстве библиотеки, этот подход может предоставить необходимую глубину управления файлами.
Применение
Теперь, когда мы рассмотрели основные подходы, давайте перейдем к более детальному анализу каждого из них, с учетом специфики вашей задачи.
Использование CLI и JSON-RPC
Хотя текущие возможности Bicep CLI и JSON-RPC не позволяют непосредственно парсить Bicep файлы, вы можете воспользоваться комбинацией этих инструментов для достижения частичного результата. Например, можно конвертировать Bicep файлы в ARM-темплейты, применить ряд изменений на уровне JSON, а затем использовать эти данные для генерации новых Bicep файлов, принимая во внимание, что некоторые специфичные особенности могут быть потеряны в процессе преобразования.
# Примерная командная строка для конвертации bicep в файл JSON:
bicep build my_template.bicep
Такая команда компилирует Bicep файл в ARM-шаблон, который вы затем можете редактировать с помощью JSON инструментов.
Работа с .NET библиотеками
Наиболее эффективным кажется использование .NET библиотек, которые лежат в основе Bicep инфраструктуры. Это может потребовать глубокого погружения в существующий код Bicep, но открывает широкие возможности для манипуляции файлами на уровне структуры.
Процесс может включать в себя:
-
Импорт существующих библиотек: неоходимо исследовать код Bicep для выявления и подключения нужных классов.
-
Парсинг и модификация: создание кода, который использует .NET классы для парсинга Bicep файлов, применения изменений, и последующего сериализования обратно в Bicep.
-
Автоматизация: интеграция этих шагов в скрипт, который может обрабатывать множество файлов в автоматическом режиме.
Пример кода может выглядеть так:
using Bicep.Core; // Псевдокод, инициализация Bicep парсера
foreach (var filepath in bicepFiles)
{
var bicepModel = BicepParser.Parse(filepath);
// Ваши изменения модели
bicepModel = ApplyCustomLogic(bicepModel);
BicepWriter.Write(bicepModel, filepath);
}
Заключение
Для эффективного программного редактирования Bicep файлов предстоит выбрать между ограниченным использованием существующих CLI инструментов и более сложным, но полнофункциональным внедрением .NET библиотек, которые хоть неофициально, но способны решить вашу задачу. Это требует больше усилий, но может быть полностью автоматизировано и масштабируемо под различные нужды.
Для успешной реализации вам может понадобиться привлечение специалистов по .NET, чтобы создать надежный инструмент с полным функционалом парсинга и обработки Bicep файлов. Такой подход обеспечит не только гибкость редактирования, но и сохранит все аспекты оригинальных шаблонов.