Содержание
- Понятие шаблона
- Структура шаблона
- Структура файлов insert_launch_key.json и insert_tasks_key.json
- Структура файла template.fastiot.yaml
- Алгоритм создания проекта
- Переменные слияния данных с файлами шаблона
- Отладка шаблона
Шаблоны используются для создания проектов и добавления фалов launch.json и tasks.json к существующему проекту. Располагаются по пути %userprofile%\fastiot\templates, например C:\Users\Anton\fastiot\templates\. Шаблоны разделяются на следующие типы:
system- системные;community- сообщества. Загружаются со сторонних ресурсов;user- пользовательские. Пользователь может самостоятельно сформировать свой произвольный шаблон.
Шаблоны перечислены в порядке загрузки в расширении. Например, если у шаблона типа user будет совпадать идентификатор id шаблона с типом system, то шаблон типа user будет игнорирован по причине уже загруженного шаблона типа system.
Если системный шаблон не пройдет проверку, то он автоматически будет удален и заменен на валидный. Если системный шаблон удалить, то он тоже будет автоматически восстановлен. Системные шаблоны автоматически обновляются при запуске расширения с ресурса Github devdotnetorg/vscode-extension-dotnet-fastiot/tree/master/templates/system. Далее, все будет рассмотрено на примере шаблона dotnet-console-runtime-info.
Шаблон представляет из себя обычный zip-архив со следующей структурой:
- storage - папка содержащая необходимые скрипты и исполняемые файлы, используемые в
tasks.json; - template - папка содержащая сам шаблон;
- template.fastiot.png - титульное изображение шаблона (пока не используется);
- template.fastiot.yaml - описание шаблона в формате YAML.
Могут размещаться любые файлы. Например, утилиты cwRsync и ssh, используемые для удаленного входа на устройство и копирования исполняемых бинарных фалов. По желанию можно заменить пакет, загрузив с официального сайта по ссылке.
Для исключения лишнего увеличения размера шаблона утилиты cwRsync и ssh были перенесены в каталог системных приложений. Теперь нет необходимости дублировать укзанные утилиты для каждого шаблона. Достаточно указать в шаблоне путь к системным утилитам, например: "%{extension.apps.builtin.aswindows}\\cwrsync\\ssh.exe".
Содержимое папки и есть сам шаблон проекта. В это папке обязательно наличие следующих файлов в папке .vscode:
- launch.json - шаблон Launch, используется для создания проекта;
- tasks.json - шаблон Tasks, используется для создания проекта;
- insert_launch_key.json - Launch для удаленной отладки, используется при создании проекта и добавления отдельного Launch к существующему проекту;
- insert_tasks_key.json - используется совместно с
insert_launch_key.json.
Изображение шаблона в формате PNG размером не более 256x256 px.
Описание шаблона в формате YAML.
Файлы insert_launch_key.json и insert_tasks_key.json содержат массив значений, которые необходимо вставить в launch.json и tasks.json. Массив должен быть в ключе values, т.е.:
{
"values": [
{
"fastiotIdLaunch": "%{launch.id}",
...
"name": "%{launch.label}",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
...
},
{
"fastiotIdLaunch": "%{launch.id}-without-logs",
...
"name": "%{launch.label} without logs",
...
}
]
}Добавлена поддержка нескольких Launch с пересекающимися tasks, т.е. в случае удаления одного из Launch, tasks используемые в других Launch не будут удалены. Примеры двух цепочек Launch => Tasks:
Launch on cubieboard (DotnetApp, Cubieboard, debugvscode)=> fastiot-96534065-build, fastiot-96534065-create-folder, fastiot-96534065-copy-app-to-device;Launch on cubieboard (DotnetApp, Cubieboard, debugvscode) without logs=> fastiot-96534065-build, fastiot-96534065-create-folder, fastiot-96534065-copy-app-to-device-without-logs.
Как видим задачи fastiot-96534065-build и fastiot-96534065-create-folder общие. Если удалить Launch Launch on cubieboard (DotnetApp, Cubieboard, debugvscode), то удалится только одна задача fastiot-96534065-copy-app-to-device т.к. остальные две используются другим Launch. Данный принцип работает только для Launch, созданных данным расширением.
Если значение ключа name, например Launch on cubieboard (DotnetApp, Cubieboard, debugvscode), будет совпадать с уже существующими названиями Launch, то тогда автоматически будет добавлен инкремент к названию, например Launch on cubieboard (DotnetApp, Cubieboard, debugvscode) #1.
В Launch были добавлены дополнительные ключи, с приставкой fastiotId*, ключи: fastiotIdLaunch, fastiotIdDevice, fastiotProject, fastiotIdTemplate. Не рекомендуется их изменять т.к. некоторые функции расширения из-за этого могут быть недоступны.
Начиная с версии v0.3.3 указанные выше ключи добавляются автоматически, если они отсутствуют в шаблоне. Т.е. теперь эти ключи для шаблона проекта являются необязательными.
Ключи:
fastiotIdLaunch- уникальный идентификатор Launch;fastiotIdDevice- уникальный идентификатор устроства;fastiotProject- уникальный идентификатор шаблона, из которого был создан Launch;fastiotIdTemplate- путь к проекту, с которым связан данный Launch;fastiotDescription- (наличие необязательно) текстовое описание Launch. Для переноса строки использовать\n(два пробела и \n).
Пример:
{
"fastiotIdLaunch": "2cecf322",
"fastiotIdDevice": "cubieboard-5e835aae",
"fastiotProject": "/DotnetConsoleAppRuntimeInfo.csproj",
"fastiotIdTemplate": "dotnet-console-runtime-info",
"fastiotDescription": "Launch with logging. \nRsync copying executable files - project_folder/rsync.log. \nDebugger - /var/log/vsdbg.log",
"name": "Launch on cubieboard (DotnetConsoleAppRuntimeInfo, Cubieboard, debugvscode)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
...
"pipeTransport": {
"pipeCwd": "${workspaceFolder}",
...
},
"preLaunchTask": "fastiot-2cecf322-copy-app-to-device"
}В файле insert_launch_key.json, ключ fastiotIdLaunch:
- Должен всегда начинаться со значения
%{launch.id}, например:%{launch.id}-without-logs; - Должен быть уникальным, например значения для первого Launch -
%{launch.id}, второго -%{launch.id}-without-logs.
Эти условия необходимо выполнять для признака связности нескольких Launch, в противном случае команда Rebuild выполнится только для одного Launch.
Файл формата YAML, схема для проверки шаблона template.schema. Рассмотрим поля:
id: dotnet-console-runtime-info- уникальный id шаблона, рекомендуется начинать с название автора или организации, напримерanton-dotnet-consoleилиcontoso-dotnet-console. Этот параметр должен обязательно совпадать с названием архива шаблонаid: dotnet-console-runtime-info=>dotnet-console-runtime-info.zip;platform: - win32- массив платформ, на которых можно использовать данный шаблон. Подразумевается среда исполнения расширения. На данный момент расширение работает только на платформеwin32. Возможные значения:win32,linux;version: "0.1"- версия шаблона;releaseDate: "2023-02-21"- дата релиза шаблона в формате YYYY-MM-DD;forVersionExt: 0.3.0- минимальная версия расширения, поддерживающая структуру данного шаблона;author: DevDotNet.ORG- автор шаблона;emailAuthor: fastiot@devdotnet.org- email;license: MIT- лицензия под которой распространяется шаблон;label: .NET Console Application Runtime Info- название шаблона;detail: Creates a console ...- краткое описание шаблона;description: The application displays ...- детальное описание шаблона;language: C#- язык программирования;endDeviceArchitecture: - armv7l, - aarch64, - x86_64- массив архитектур процессора конечного устройства на котором будет исполняться приложение. Возможные значения:armv6l,armv7l,aarch64,riscv64,x86_64;dependOnPackages: # Coming in one of the next version- необходимые пакеты для работы приложения на конечном устройстве (пока не используется);typeProj: dotnet- тип проекта. В зависимости от типа формируется дополнительная логика обработки шаблона, например, показывается окно выбора версии .NET framework. Для всех .NET шаблонов необходимо указыватьdotnet;projName: DotnetConsoleAppRuntimeInfo- название проекта по умолчанию;mainFileProj: dotnetapp.csproj- путь в шаблоне к главному файлу проекта. Если размещается в папке, то указывать, напримерfolder1/dotnetapp.csproj.mainFileProjLabel: Visual Studio C# Project- название главного файла проекта;tags: - console- массив тегов для поиска шаблона, значения могут быть любые (пока не используется);filesToProcess: - dotnetapp.csproj, - Program.cs- массив путей к файлам в шаблоне, к которым будет применяться подстановка переменных, например%{project.dotnet.targetframework}. Если файл размещается в папке, то указывать, напримерfolder1/file.ext.;fileNameReplacement- массив значений, инструкции к переименованию файлов в форматестарый_путь_как_в_шаблоне=новый_путь_как_в_проекте. Например, возьмем строкуdotnetapp.csproj=%{project.name}.csproj. Файлdotnetapp.csprojв каталоге проекта будет переименован вDotnetConsoleAppRuntimeInfo.csproj, исходя из переменных подстановки.
Алгоритм располагается в классе IotTemplate функция CreateProject. Выполняется следующая последовательность:
- Целиком копируется папка
/templateиз шаблона в каталог проекта. - Создается словарь для замены переменных, таких как
%{variable}. - Выполняется переименование файлов из секции
FileNameReplacement, файлtemplate.fastiot.yaml. - Переопределение название проекта исходя из предыдущего этапа, если таковое имеется.
- Выполняется подстановка переменных для файлов из секции
FilesToProcess. - Вставляются Launch из файла
/template/.vscode/insert_launch_key.json. - Переименовываются Launch в случае совпадения названий в проекте.
- Вставляются Tasks из файла
/template/.vscode/insert_tasks_key.json. - Открывается в VSCode папка с проектов.
Переменные будут рассмотрены для шаблона dotnet-console-runtime-info. Входные данные:
- устройство - cubieboard;
- шаблон -
dotnet-console-runtime-info; - путь к шаблону -
C:\Users\Anton\fastiot\templates\system\dotnet-console-runtime-info; - название проекта -
DotnetConsoleAppRuntimeInfo; - папка сохранения проекта
D:\Anton\Projects\Tests\DotnetConsoleAppRuntimeInfo; - .NET framework -
.NET 5.
Переменные:
- "%{project.dotnet.targetframework}" => "net5.0".
- "%{project.name}" => "DotnetConsoleAppRuntimeInfo".
- "%{project.mainfile.path.relative.aslinux}" => "/DotnetConsoleAppRuntimeInfo.csproj".
- "%{project.mainfile.path.relative.aswindows}" => "\\DotnetConsoleAppRuntimeInfo.csproj".
- "%{project.mainfile.path.full.aslinux}" => "D:/Anton/Projects/Tests/DotnetConsoleAppRuntimeInfo/DotnetConsoleAppRuntimeInfo.csproj".
- "%{project.mainfile.path.full.aswindows}" => "D:\\Anton\\Projects\\Tests\\DotnetConsoleAppRuntimeInfo\\DotnetConsoleAppRuntimeInfo.csproj".
- "%{project.path.relative.aslinux}" => "".
- "%{project.path.relative.aswindows}" => "".
- "%{project.path.full.ascygdrive}" => "/cygdrive/d/Anton/Projects/Tests/DotnetConsoleAppRuntimeInfo".
- "%{project.type}" => "dotnet".
- "%{device.id}" => "cubieboard-5e835aae".
- "%{device.ssh.key.path.full.aswindows}" => "C:\\Users\\Anton\\fastiot\\settings\\keys\\id-rsa-cubieboard-5e835aae-debugvscode".
- "%{device.ssh.port}" => "22".
- "%{device.user.debug}" => "debugvscode".
- "%{device.host}" => "192.168.43.14".
- "%{device.label}" => "cubieboard".
- "%{device.board.name}" => "Cubieboard".
- "%{launch.id}" => "2cecf322".
- "%{template.id}" => "dotnet-console-runtime-info".
- "%{template.storage.path.aswindows}" => "C:\\Users\\Anton\\fastiot\\templates\\system\\dotnet-console-runtime-info\\storage".
- "%{project.dotnet.namespace}" => "DotnetConsoleAppRuntimeInfo".
- "%{device.dotnet.rid}" => "linux-arm".
- "%{launch.label}" => "Launch on cubieboard (DotnetConsoleAppRuntimeInfo, Cubieboard, debugvscode)".
- "%{extension.apps.builtin.aswindows}" => "c:\\Users\\Anton\\.vscode\\extensions\\devdotnetorg.vscode-extension-dotnet-fastiot-0.3.3\\windows\\apps".
- "%{os.userinfo.username}" => "Anton".
Значения при наличии каталогов в пути
Значения переменных при вложенном каталоге, например, когда проект располагается не в корне каталога /template, а во вложенной папке /template/nested. Шаблон dotnet-console-test-nested. Список переменных только тех, которые были изменены из-за наличия вложенной папки.
Переменные:
- "%{project.mainfile.path.relative.aslinux}" => "/nested/DotnetConsoleAppTestNested.csproj".
- "%{project.mainfile.path.relative.aswindows}" => "\\nested\\DotnetConsoleAppTestNested.csproj".
- "%{project.mainfile.path.full.aslinux}" => "D:/Anton/Projects/Tests/DotnetConsoleAppTestNested/nested/DotnetConsoleAppTestNested.csproj".
- "%{project.mainfile.path.full.aswindows}" => "D:\\Anton\\Projects\\Tests\\DotnetConsoleAppTestNested\\nested\\DotnetConsoleAppTestNested.csproj"}.
- "%{project.path.relative.aslinux}" => "/nested".
- "%{project.path.relative.aswindows}" => "\\nested".
- "%{project.path.full.ascygdrive}" => "/cygdrive/d/Anton/Projects/Tests/DotnetConsoleAppTestNested/nested".
Если вам нужны дополнительные переменные, создайте ISSUE.
Все ошибки связанные с проверкой шаблона будут отображены в окне OUTPUT.
Если возникнет ошибка валидации структуры JSON, то в окне OUTPUT отобразится позиция в файле, которая вызвала ошибку. В этом случае исходный файл останется неизменным, и будет создан новый с именем debug_launch_json.txt или debug_tasks_json.txt в каталоге проекта.
Параметр Fastiot: Debug в настройках расширения включает режим отладки шаблона. В этом режим выводится и сохраняется дополнительная информация при создание проекта из шаблона или добавление Launch к существующему проекту. Так сохраняется следующая информация:
- В папке проекта сохраняются текстовые файлы с содержанием значений переменных для слияния. Слияние с шаблоном выполняется в несколько шагов. Например на первом шаге выполнения слияния сохраняется файл с названием
Step1CopyValues. Данный файл содержит значения переменных полученые при интерактивном взаимодействии с пользователем, в режиме вопрос-ответ. Всего 5 шагов:Step1CopyValues,Step2AddDeviceInfo,Step3DependencyProjectType,Step4Additional,Step5DefinePathToProject.