Введение
Решая довольно элементарную задачу и не осилив спартанских условий разработки под ESP8266 решил вернуться в уютный мир .Net в котором есть и автодополнение и отладка.
Итак, имеем на руках:
- Компьютер с Windows 10 Pro Build 1803 (однако почти всё написанное ниже можно выполнить и на *nix с минимальными изменениями)
- Orange Pi Zero с установленным Raspbian Server
- Желание писать код на C# и отлаживать на устройстве просто нажав F5
Подготовка окружения
Компьютер разработчика
Разработка будет вестись в Visual Studio Code с установленным расширением C#
.
Необходим установленный .NET Core SDK.
Также желательно иметь версию Windows 10 1803, так как в неё по умолчанию установлен OpenSSH. В более ранних версиях Windows 10 OpenSSH можно установить через "Управление дополнительными компонентами". Однако при этом ни что не запрещает пользоваться сторонними SSH клиентами.
Целевое устройство
Подготовка
В первую очередь необходимо настроить SSH доступ по ключу. В этом отлично помогает отличная инструкция от Digital Ocean.
*Примечание:
Приватные ключи можно хранить отдельными файлами в папке .ssh, но я рекомендую использовать довольно удобную связку KeePass+KeeAgent. KeePass обеспечивает безопасное хранение ключа, а KeeAgent предоставляет ключи. Для того, чтобы он заработал с встроенным в Windows SSH клиентом необходимо активировать соответствующую экспериментальную настройку.*
Установка .NET Core SDK
Так как официальный репозиторий Microsoft не содержит пакетов, собранных под ARM32, необходимо установить .NET Core SDK вручную.
В первую очередь неоходимо установим зависимости, перечисленные в документации.
apt-get install liblttng-ust0 libcurl3 libssl1.0.0 libkrb5-3 zlib1g libicu52 gettext
Теперь можно установить SDK.
Прямую ссылку на архив c SDK можжно взять со страницы SDK на GitHub.
curl -sSL -o dotnet.tar.gz https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.401/dotnet-sdk-latest-linux-arm.tar.gz
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
Установка удалённого отладчика
Скрипт установки удалённого отладчика использует unzip
:
sudo apt-get install unzip
Для установки удалённого отладчика необходимо выполнить следующую команду:
curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -r linux-arm -v latest -l ~/vsdbg
Настройка VS Core для удалённого развёртывания и отладки на linux
1. Создаем проект
Тут всё очень просто:
mkdir DemoProject
cd DemoProject
dotnet new console
2. Создаем файлы конфигурации
Открываем папку с проектом. Расширение C# автоматически скачает пакеты OmniSharp и .NET Core Debuger, если это не было сделано ранее. После этого нам будет предложено создать assets для сборки и отладки проекта. Соглашаемся на это. В результате появится папка .vscode
с файлами tasks.json
и launch.json
. В этих файлах описаны задачи, которые можно выполнять и конфигурации запуска. По умолчанию создаётся конфигурация запуска отладки, зависящая от задачи сборки.
3. Правим файлы конфигурации
Основная идея запуска и отладки на удалённом устройстве состоит в том, чтобы создать задачи, собирающие проект и копирующие его на устройство и конфигурацию запуска, использующую удалённый отладчик.
Приведу описание готовых задач:
{
"version": "2.0.0",
"tasks": [
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/DemoProject.csproj"
]
},
{
"label": "copy-to-device",
"dependsOn": "publish",
"command": "scp",
"type": "process",
"args": [
"-r",
"-v",
"${workspaceFolder}/bin/Debug/netcoreapp2.1/publish/.",
"<target_user>@<target_ip>:~/DemoProject/"
]
},
]
}
Задача publish
вызывает команду dotnet publish
, которая упаковывает приложение и его зависимости в папку для развертывания.
Команда copy-to-device
использует scp
для копирования опубликованного приложения на удалённое устройство. Обратите внимание на точку в конце пути из которого происходит копирование. Если её не указать, то при последующих копированиях папка publish
будет помещена в DemoProject
, а не перезапишет ёё. Параметр dependsOn
указывает на то, что copy-to-device
зависит от publish
. Таким образом перед выполнением copy-to-device
выполнится publish
.
Далее необходимо настроить конфигурацию удалённого запуска и отладки:
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "copy-to-device",
"program": "~/DemoProject/DemoProject.dll",
"args": [],
"cwd": "~/DemoProject",
"console": "internalConsole",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart",
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "ssh",
"pipeArgs": [ "-T", "<target_user>@<target_ip>" ],
"debuggerPath": "~/vsdbg/vsdbg",
"quoteArgs": true
}
}
,]
}
Параметр "preLaunchTask": "copy-to-device"
указывает на то, что перед началом сеанса отладки необходимо выполнить задачу copy-to-device
. Таким образом каждый раз перед отладкой будет происходить публикация проекта и его копирование на целевое устройство.
Параметр pipeTransport
позволяет настроить использование удалённого отладчика. В данном случае в качестве программы, обеспечивающей транспорт используется ssh
, но ни что не мешает использовать и plink.exe
из набора программ putty
.
4. Отлаживаемся
После нажатия F5 происходит сборка, копирование проекта и запуск приложения на удалённом устройстве. Отладка происходит полностью идентично локальной.
Примечание:
После завершения работы приложения я каждый раз получал сообщение Error from pipe program 'ssh': Process is terminating due to StackOverflowException
. Судя по открытому issue на GitHub — это известная проблема отладчика. Но раз ошибка происходит уже после завершения отладки, на это можно не обращать внимания
Использованные ресурсы
→ Setting up Raspian and .NET Core 2.0 on a Raspberry Pi
→ Omnisharp-vscode Remote Debugging On Linux Arm
→ Справка команды dotnet publish
→ Configuring launch.json for C# debugging
→ Visual Studio Code Integrate with External Tools via Tasks