Удалённое развертывание и отладка dotnet core приложений на *nix

от автора

Введение

Решая довольно элементарную задачу и не осилив спартанских условий разработки под 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


ссылка на оригинал статьи https://habr.com/post/422141/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *