在* nix上远程部署和调试dotnet核心应用程序

引言


解决了一个相当基本的任务,并且没有掌握ESP8266的Spartan开发条件,我决定回到舒适的.Net世界,那里有自动完成和调试功能。


因此,我们手边有:


  • 装有Windows 10 Pro Build 1803的计算机(但是,几乎所有下面编写的内容都可以在* nix上完成,而无需进行太多更改)
  • 安装了Raspbian Server的Orange Pi Zero
  • 只需按F5键,就可以用C#编写代码并在设备上进行调试的愿望

环境准备


开发者计算机


将使用安装了C#扩展名的Visual Studio Code进行开发。


需要安装的.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。


您可以从GitHub上 SDK 页面的SDK中直接链接到存档。


 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软件包。 之后,将要求我们创建资产以构建和调试项目。 我们对此表示同意。 结果, .vscode文件夹将.vscode tasks.jsonlaunch.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用作提供传输的程序,但是没有什么可以阻止putty程序putty plink.exe


4.调试


按F5后,将构建项目,将项目复制,然后在远程设备上启动应用程序。 调试与本地完全相同。


注意事项:
应用程序终止后,每次我Error from pipe program 'ssh': Process is terminating due to StackOverflowException消息中收到Error from pipe program 'ssh': Process is terminating due to StackOverflowException消息Error from pipe program 'ssh': Process is terminating due to StackOverflowException 从GitHub上的公开问题来看,这是一个已知的调试器问题。 但是由于错误是在调试完成后发生的,因此您可以忽略此错误


使用资源


在Raspberry Pi上设置Raspian和.NET Core 2.0
Linux Arm上的Omnisharp-vscode远程调试
dotnet发布命令帮助
为C#调试配置launch.json
Visual Studio代码通过任务与外部工具集成

Source: https://habr.com/ru/post/zh-CN422141/


All Articles