1. Introdução
Resolvendo uma tarefa bastante elementar e não tendo dominado as condições de desenvolvimento espartano para o ESP8266, decidi voltar ao aconchegante mundo .Net no qual há a conclusão automática e a depuração.
Então, temos em mãos:
- Um computador com Windows 10 Pro Build 1803 (no entanto, quase tudo que é escrito abaixo pode ser feito no * nix com alterações mínimas)
- Orange Pi Zero com o servidor Raspbian instalado
- O desejo de escrever código em C # e depurar no dispositivo pressionando F5
Preparação do ambiente
Computador do desenvolvedor
O desenvolvimento será conduzido no Visual Studio Code com a extensão C#
instalada.
É necessário um .NET Core SDK instalado.
Também é aconselhável ter uma versão do Windows 10 1803 , pois o OpenSSH é instalado por padrão nele. Nas versões anteriores do Windows 10, o OpenSSH pode ser instalado por meio de Gerenciar Complementos. No entanto, ao mesmo tempo, nada proíbe o uso de clientes SSH de terceiros.
Dispositivo alvo
Preparação
Primeiro de tudo, você precisa configurar o acesso à chave SSH. A excelente instrução da Digital Ocean ajuda perfeitamente com isso.
* Nota:
As chaves privadas podem ser armazenadas como arquivos separados na pasta .ssh, mas eu recomendo usar o grupo bastante conveniente do KeePass + KeeAgent . O KeePass fornece armazenamento seguro de chaves e o KeeAgent fornece chaves. Para que ele funcione com o cliente SSH do Windows interno, você deve ativar a configuração experimental correspondente. *
Instale o .NET Core SDK
Como o repositório oficial da Microsoft não contém pacotes compilados para o ARM32, você deve instalar o .NET Core SDK manualmente.
Primeiro de tudo, precisamos instalar as dependências listadas na documentação .
apt-get install liblttng-ust0 libcurl3 libssl1.0.0 libkrb5-3 zlib1g libicu52 gettext
Agora você pode instalar o SDK.
Você pode obter um link direto para o arquivo morto a partir do SDK na página SDK do 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
Instalar depurador remoto
O script de instalação do depurador remoto usa unzip
:
sudo apt-get install unzip
Para instalar o depurador remoto, execute o seguinte comando:
curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -r linux-arm -v latest -l ~/vsdbg
Configurando o VS Core para implantação remota e depuração no linux
1. Crie um projeto
Tudo é muito simples aqui:
mkdir DemoProject cd DemoProject dotnet new console
2. Crie arquivos de configuração
Abra a pasta com o projeto. A extensão C # baixará automaticamente os pacotes OmniSharp e .NET Core Debuger, se isso não tiver sido feito antes. Depois disso, seremos solicitados a criar ativos para criar e depurar o projeto. Nós concordamos com isso. Como resultado, a pasta .vscode
com os launch.json
e launch.json
. Esses arquivos descrevem tarefas que você pode executar e configurações de inicialização. Por padrão, uma configuração de inicialização de depuração é criada, dependendo da tarefa de compilação.
3. Edite os arquivos de configuração
A idéia básica de iniciar e depurar em um dispositivo remoto é criar tarefas que coletam o projeto e copiam para o dispositivo e a configuração de inicialização usando o depurador remoto.
Vou dar uma descrição das tarefas concluídas:
{ "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/" ] }, ] }
A tarefa de publish
chama o comando de dotnet publish
, que empacota o aplicativo e suas dependências em uma pasta para implantação.
O comando copy-to-device
usa scp
para copiar o aplicativo publicado para o dispositivo remoto. Preste atenção ao ponto no final do caminho a partir do qual a cópia ocorre. Se você não especificar, nas cópias subseqüentes, a pasta de publish
será colocada no DemoProject
e não a substituirá. O parâmetro dependsOn
indica que a copy-to-device
depende da publish
. Portanto, antes de executar a copy-to-device
publish
será executada.
Em seguida, você precisa definir a configuração remota de início e depuração:
{ "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 } } ,] }
O "preLaunchTask": "copy-to-device"
indica que você deve concluir a tarefa de copy-to-device
antes de iniciar uma sessão de depuração. Portanto, sempre que antes da depuração, o projeto será publicado e copiado no dispositivo de destino.
O parâmetro pipeTransport
permite configurar o uso de um depurador remoto. Nesse caso, o ssh
usado como o programa que fornece o transporte, mas nada impede o plink.exe
do putty
programas putty
.
4. Depuração
Depois de pressionar F5, o projeto é criado, o projeto é copiado e o aplicativo é iniciado no dispositivo remoto. A depuração é completamente idêntica à local.
Nota:
Após o término do aplicativo, sempre que eu recebia uma mensagem de Error from pipe program 'ssh': Process is terminating due to StackOverflowException
. A julgar pelo problema aberto no GitHub, esse é um problema conhecido do depurador. Mas como o erro ocorre após a conclusão da depuração, você pode ignorar isso
Recursos utilizados
→ Configurando o Raspian e o .NET Core 2.0 em um Raspberry Pi
→ Depuração Remota Omnisharp-vscode no Linux Arm
→ ajuda do comando dotnet publish
→ Configurando o launch.json para depuração em C #
→ Código do Visual Studio Integre-se com Ferramentas Externas através de Tarefas