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

  • Tutorial

Введение


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

Поделиться публикацией
Комментарии 10
    +2
    Решая довольно элементарную задачу и не осилив спартанских условий разработки под ESP8266

    Слабак :)
      0
      А как же .NETMF с нулевым порогом вхождения ?!
        0
        Разве .NET MF можно запустить на ESP? Мне было нужно что-то с WiFi.
          0
          WiFi не только на ESP бывает.
          Да и показания проще без .NET снять на ESP.
          Хотя для получения практики установки .NET — самое то.
            0
            Так я изначально и хотел на ESP всё сделать, но не пошло — то одна тулза не завелась, то что-то где-то отвалилось. Вернулся в удобные для себя условия.
        +1
        Для чего планируете использовать? Немного удивил переход с ESP8266, так как весовые категории абсолютно разные.

        П.С.
        В ESP8266 все нормально с авто дополнением если не использовать Arduino IDE. Есть альтернатива: Visual Studio + Arduino IDE for Visual Studio.
        В ESP32 есть полноценная отладка.
          +1
          Это подготовительная часть небольшого проекта — нужно снять показания с акселерометра, работающего с разными настройками.
          В итоге должно получиться устройство, которое крепится на рукоять лука и считает выстрелы. Понятно, что в конечном устройстве будет простенький МК, а не такой одноплатник.
            0
            А можно подробнее про отладку в ESP32? Ссылку на статью, как это делать, например.
              0
              Наверное лучше гуглить по ESP32 + JTAG. Видел несколько статей/видео, но нет конкретных ссылок.
              Сам пока только поигрался с Arduino Core для ESP32 и запускал готовые примеры с esp-idf. В планах копать глубже в сторону esp-idf.
            0

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое